Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1357

 
DanilaMactep:
E questo processo dovrebbe essere scritto dopo ogni riga in cui c'è un tentativo di aprire un ordine usando l'order-send - giusto?

Dopo tutte le transazioni OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

 
MakarFX:

Dopo tutte le transazioni OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

Se il mio Expert Advisor viene cancellato dal grafico, non funzionerà, a meno che non lo aggiunga di nuovo manualmente. Come posso resettarlo per farlo funzionare automaticamente?
 
DanilaMactep:
Questo deve essere scritto dopo ogni riga in cui c'è un tentativo di aprire un ordine usando l'order-send - è corretto?

Se si escludono gli errori relativi a

MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT

allora i gufi non batteranno il server

 
DanilaMactep:
Se l'EA viene cancellato dal grafico, non funziona finché non lo carico di nuovo manualmente. Come posso resettarlo automaticamente?
Non si può fare automaticamente, serve per correggere l'errore
 
DanilaMactep:

E questo caso deve essere scritto dopo ogni riga in cui c'è un tentativo di aprire un ordine usando ordersend - giusto?

Se per "questo caso" intendiamo il controllo del volume di ordine minimo e massimo consentito, del passo di volume, del numero massimo consentito di affari+ordine, della sufficienza del margine libero (questi sono i punti principali, per i quali il validatore rifiuta più spesso), allora è più ragionevole scrivere una funzione, chiamandola OrderCheck per esempio.
Poi, prima di aprire un nuovo affare, controllate semplicemente il volume.
All'incirca così:

Lot=OrderCheck(OP_BUY,Lot);
// или
Lot=OrderCheck(OP_SELL,Lot);
 

Buon giorno a tutti i cari programmatori! È da un giorno che sto lottando con un problema e non riesco a capirlo. Per favore, aiutatemi a risolverlo.

La linea di fondo:

Lo strumento è RTS futures,periodo di M5;

L'algoritmo deve cambiare i parametri SL e TP a seconda del tempo, e soprattutto, la posizione aperta è chiusa non da TP (request.tp = ....) e l'ordine di mercato contro, se determinate condizioni sono soddisfatte.

Ci sono tre intervalli: 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // dalle 12:00:01 - 12:03:00

2) (stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09) // 16:05:01 - 16:09:00

3) (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00


Nell'intervallo "1)" i parametri SL e TP = 200 e 200

Agli intervalli "2)" e "3)", SL e TP = 100 e 100


Il problema: l'algoritmo fissa il profitto SOLO SULLO SWITCH CORRENTE, ma abbiamo bisogno di mantenere la condizione di presa di profitto per n più candele (almeno 10-15)
periodo grafico M5

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime some_time=TimeCurrent();
#define  EXPERT_MAGIC 1010   // MagicNumber эксперта 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double  Ask = SymbolInfoDouble(NULL, SYMBOL_ASK);
   double  Bid = SymbolInfoDouble(NULL, SYMBOL_BID);

   double SL=0;
   double TP=0;

   datetime    tm=TimeCurrent();
   MqlDateTime stm;
   TimeToStruct(tm,stm);

   bool is_siesta=false;

   if (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03)    // Условия SL и TP работают только в этом интервале времени
     {
       SL=200/_Point;
      TP=200/_Point;
      is_siesta=true;
     }
   else
     {


      if(((stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09)) || (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04))    // Условия SL и TP работают только в этих интервалах времени
        {
         SL=100/_Point;
         TP=100/_Point; // тейк профит закрывается кодом
         is_siesta=true;
        }
      else
        {
         return;
        }
     }

   double Lots=1;

   datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрению
   datetime static timeOpen = 0;


   if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50))  // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {

      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};

      request.action   =TRADE_ACTION_DEAL;
      request.symbol   =Symbol();
      request.volume   =Lots;
      request.type     =ORDER_TYPE_BUY;
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      request.deviation= 5;
      request.sl    = NormalizeDouble(Ask-SL*_Point,_Digits);
      request.magic    = 1010;

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }


   if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {
      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};

      request.action   =TRADE_ACTION_DEAL;
      request.symbol   =Symbol();
      request.volume   =Lots;
      request.type     =ORDER_TYPE_SELL;
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID);
      request.deviation= 5;
      request.sl    = NormalizeDouble(Bid+SL*_Point,_Digits);
      request.magic    = 1010;

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL)

   if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10))   // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {


      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};
      int total=PositionsTotal(); // количество открытых позиций
      //--- перебор всех открытых позиций
      for(int i=total-1; i>=0; i--)
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
         double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
         ulong  magic=PositionGetInteger(POSITION_MAGIC);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции

         if((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику
           {
            request.action   =TRADE_ACTION_DEAL;
            request.symbol   =Symbol();
            request.volume   =Lots;
            request.type     =ORDER_TYPE_BUY;
            request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); 

            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp

///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY)

   if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10))  // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {
      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};
      int total=PositionsTotal(); // количество открытых позиций
      //--- перебор всех открытых позиций
      for(int i=total-1; i>=0; i--)
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
         double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
         ulong  magic=PositionGetInteger(POSITION_MAGIC);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции

         if((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику
           {
            request.action   =TRADE_ACTION_DEAL;
            request.symbol   =Symbol();
            request.volume   =Lots;
            request.type     =ORDER_TYPE_SELL;
            request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID);

            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp
  }

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 

Alexey Belyakov:

Il problema: l'algoritmo fissa il profitto SOLO SULLO SWITCH CORRENTE, ma abbiamo bisogno di mantenere la condizione di presa di profitto per n-curve (almeno 10-15).

Periodo del grafico M5

L'azione SL e TP è limitata dal tempo nel codice. SL e TP separati per la siesta, e SL e TP separati per la siesta

 
Alexey Belyakov:

Buon giorno a tutti i cari programmatori! È da un giorno che sto lottando con un problema e non riesco a capirlo. Per favore, aiutatemi a risolverlo.

Si può cambiare il tempo di esecuzione e il numero di barre

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime some_time=TimeCurrent();
#define  EXPERT_MAGIC 1010   // MagicNumber эксперта 
input string TimeStart_1= "12:00:01"; 
input string TimeStop_1 = "12:03:00";
input string TimeStart_2= "16:05:01";
input string TimeStop_2 = "16:09:00";
input string TimeStart_3= "20:00:11"; 
input string TimeStop_3 = "20:04:00";
input int    BarTrade   = 10;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double  Ask = SymbolInfoDouble(NULL, SYMBOL_ASK);
   double  Bid = SymbolInfoDouble(NULL, SYMBOL_BID);

   double SL=0;
   double TP=0;

   datetime    tm=TimeCurrent();
   MqlDateTime stm;
   TimeToStruct(tm,stm);

   int TimeBarTrade=BarTrade*Period()*60;
   bool is_siesta=false;

   if((TimeCurrent()>=StringToTime(TimeStart_1) && TimeCurrent()<=StringToTime(TimeStop_1))||    
      (TimeCurrent()>=StringToTime(TimeStart_2) && TimeCurrent()<=StringToTime(TimeStop_2))||    
      (TimeCurrent()>=StringToTime(TimeStart_3) && TimeCurrent()<=StringToTime(TimeStop_3)))    
     {is_siesta=true;}
   else
     {is_siesta=false;}

   if(TimeCurrent()>=StringToTime(TimeStart_1) && TimeCurrent()<=(StringToTime(TimeStop_1)+TimeBarTrade))    
        {
         SL=200/_Point;
         TP=200/_Point;
        }
   if((TimeCurrent()>=StringToTime(TimeStart_2) && TimeCurrent()<=(StringToTime(TimeStop_2)+TimeBarTrade))||    
      (TimeCurrent()>=StringToTime(TimeStart_3) && TimeCurrent()<=(StringToTime(TimeStop_3)+TimeBarTrade)))    
        {
         SL=100/_Point;
         TP=100/_Point; 
        }

   double Lots=1;

   datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрению
   datetime static timeOpen = 0;


   if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50))  // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {

      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};

      request.action   =TRADE_ACTION_DEAL;
      request.symbol   =Symbol();
      request.volume   =Lots;
      request.type     =ORDER_TYPE_BUY;
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      request.deviation= 5;
      request.sl    = NormalizeDouble(Ask-SL*_Point,_Digits);
      request.magic    = 1010;

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }


   if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
     {
      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};

      request.action   =TRADE_ACTION_DEAL;
      request.symbol   =Symbol();
      request.volume   =Lots;
      request.type     =ORDER_TYPE_SELL;
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID);
      request.deviation= 5;
      request.sl    = NormalizeDouble(Bid+SL*_Point,_Digits);
      request.magic    = 1010;

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      timeOpen = timeBar;
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL)

   if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10))   // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {


      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};
      int total=PositionsTotal(); // количество открытых позиций
      //--- перебор всех открытых позиций
      for(int i=total-1; i>=0; i--)
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
         double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
         ulong  magic=PositionGetInteger(POSITION_MAGIC);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции

         if((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику
           {
            request.action   =TRADE_ACTION_DEAL;
            request.symbol   =Symbol();
            request.volume   =Lots;
            request.type     =ORDER_TYPE_BUY;
            request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); 

            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp

///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY)

   if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10))  // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
     {
      MqlTradeRequest request= {0};
      MqlTradeResult  result= {0};
      int total=PositionsTotal(); // количество открытых позиций
      //--- перебор всех открытых позиций
      for(int i=total-1; i>=0; i--)
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);                                      // тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL);                        // символ
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // количество знаков после запятой
         double volume=PositionGetDouble(POSITION_VOLUME);                                 // объем позиции
         ulong  magic=PositionGetInteger(POSITION_MAGIC);
         ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // тип позиции

         if((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику
           {
            request.action   =TRADE_ACTION_DEAL;
            request.symbol   =Symbol();
            request.volume   =Lots;
            request.type     =ORDER_TYPE_SELL;
            request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID);

            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp
  }
 
Grazie mille MakarFX! Funziona come dovrebbe!
 
Alexey Belyakov:
Grazie mille MakarFX! Ora funziona come dovrebbe!

Prego)