How do I create a loop that allows you to cancel the previous order when it passes a certain value?

Asked

Viewed 62 times

2

Good evening. The following language is MQL5. I am creating a robot for Metatrader 5. I created after many hours the following code. I made the comments in English just like in the tutorial because the video was in English. My goal is to have a BUY order created whenever the value of RSI(Relative Strenght Index) is greater than 70, and once it is less than 70, it creates a SELL order, deleting the previous order. Since the strategy will always respond to RSI values, it does not need Stop Loss or Take Profit. There are some things I don’t know what they do or if they’re really necessary. I’d like to know what I did wrong. Thanks to those who can help.

//+------------------------------------------------------------------+
//|                                                     RSIrobot.mq5 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalRSI.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title         ="RSIrobot";  // Document name
ulong                    Expert_MagicNumber   =18801;       //
bool                     Expert_EveryTick     =false;       //
//--- inputs for main signal
input int                Signal_ThresholdOpen =10;          // Signal threshold value to open    [0...100]
input int                Signal_ThresholdClose=10;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel    =0.0;         // Price level to execute a deal
input double             Signal_StopLevel     =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel     =50.0;        // Take Profit level (in points)
input int                Signal_Expiration    =4;           // Expiration of pending orders (in bars)
input int                Signal_RSI_PeriodRSI =14;          // Relative Strength Index(14,...) M1     Period of calculation
input ENUM_APPLIED_PRICE Signal_RSI_Applied   =PRICE_CLOSE; // Relative Strength Index(14,...) M1 Prices series
input double             Signal_RSI_Weight    =1.0;         // Relative Strength Index(14,...) M1   Weight [0...1.0]
//--- inputs for money
input double             Money_FixLot_Percent =100.0;       // Percent
input double             Money_FixLot_Lots    =0.05;        // Fixed volume
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
if(!ExtExpert.Init(Symbol(),PERIOD_M1,Expert_EveryTick,Expert_MagicNumber))
  {
   //--- failed
   printf(__FUNCTION__+": error initializing expert");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
//--- Creating signal
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
  {
   //--- failed
   printf(__FUNCTION__+": error creating signal");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalRSI
CSignalRSI *filter0=new CSignalRSI;
if(filter0==NULL)
  {
   //--- failed
   printf(__FUNCTION__+": error creating filter0");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
signal.AddFilter(filter0);
//--- Set filter parameters
filter0.Period(PERIOD_M1);
filter0.PeriodRSI(Signal_RSI_PeriodRSI);
filter0.Applied(Signal_RSI_Applied);
filter0.Weight(Signal_RSI_Weight);
//--- Creation of trailing object
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
  {
   //--- failed
   printf(__FUNCTION__+": error creating trailing");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
//--- Add trailing to expert (will be deleted automatically))
if(!ExtExpert.InitTrailing(trailing))
  {
   //--- failed
   printf(__FUNCTION__+": error initializing trailing");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
 //--- Set trailing parameters
 //--- Creation of money object
CMoneyFixedLot *money=new CMoneyFixedLot;
if(money==NULL)
  {
   //--- failed
   printf(__FUNCTION__+": error creating money");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
//--- Add money to expert (will be deleted automatically))
if(!ExtExpert.InitMoney(money))
  {
   //--- failed
   printf(__FUNCTION__+": error initializing money");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
//--- Set money parameters
money.Percent(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parameters
if(!ExtExpert.ValidationSettings())
  {
   //--- failed
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
//--- Tuning of all necessary indicators
if(!ExtExpert.InitIndicators())
  {
   //--- failed
   printf(__FUNCTION__+": error initializing indicators");
   ExtExpert.Deinit();
   return(INIT_FAILED);
  }
//--- ok
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
 {
  ExtExpert.OnTrade();
 }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
  ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

1 answer

0

The form of events used in the code does not allow the desired behavior. The RSI’s synalider will indicate purchase when it’s below, say, 30, at weight 10. When back up to 30 may be indicating still buy with weight 2. This means that to do the behavior you want to change the event generator code and your scores. See the code in the include area that talks about the RSI event generator to also know what to disconnect from the standard execution via call to Pattern or Weigth function (a pattern analysis may always stay on, but have no contribution to weight).

Another thing is that a purchase order can be opened and closed and not have the need to generate a sales order. Generating an opposite position to terminate an open position can be problematic if you are working with a type of account called a hedge.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.