Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1357

 
DanilaMactep:
Und dieser Prozess sollte nach jeder Zeile geschrieben werden, in der versucht wird, eine Bestellung mit der Funktion "Bestellung senden" zu öffnen - richtig?

Nach allen Geschäften OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

 
MakarFX:

Nach allen Geschäften OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()

Wenn mein Expert Advisor aus dem Diagramm gelöscht wird, funktioniert er nicht mehr, es sei denn, ich füge ihn manuell wieder hinzu. Wie kann ich die automatische Funktion wiederherstellen?
 
DanilaMactep:
Dies muss nach jeder Zeile geschrieben werden, in der versucht wird, eine Bestellung mit dem Befehl "Senden" zu öffnen - ist dies korrekt?

Wenn Sie Fehler ausschließen, die sich auf

MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT

dann werden die Eulen nicht auf den Server eindreschen

 
DanilaMactep:
Wenn der EA aus dem Diagramm gelöscht wird, funktioniert er nicht, bis ich ihn manuell wieder hochlade. Wie kann ich sie automatisch zurücksetzen?
Das geht nicht automatisch, sondern nur zur Korrektur des Fehlers.
 
DanilaMactep:

Und dieser Fall muss nach jeder Zeile geschrieben werden, in der versucht wird, eine Bestellung mit ordersend zu öffnen - richtig?

Wenn wir mit "diesem Fall" die Überprüfung des minimal und maximal zulässigen Auftragsvolumens, des Volumenschritts, der maximal zulässigen Anzahl von Geschäften+Auftrag, der ausreichenden freien Marge meinen (das sind die Hauptpunkte, bei denen der Validator am häufigsten ablehnt), dann ist es sinnvoller, eine Funktion zu schreiben und sie z.B. OrderCheck zu nennen.
Prüfen Sie dann vor der Eröffnung eines neuen Geschäfts einfach das Volumen.
Ungefähr so:

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

Guten Tag, liebe Programmierer! Seit einem Tag kämpfe ich mit einem Problem, und ich kann es nicht lösen. Bitte helfen Sie mir, das Problem zu lösen.

Die Quintessenz:

Bei dem Instrument handelt es sich um RTS-Futures mit einerLaufzeit von M5;

Der Algorithmus muss die Parameter SL und TP in Abhängigkeit von der Zeit ändern, und, was wichtig ist, die offene Position wird nicht durch TP ( request.tp = ....) und den Gegenmarktauftrag geschlossen, wenn bestimmte Bedingungen erfüllt sind.

Es gibt drei Intervalle: 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // von 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.Stunde>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00


Im Intervall "1)" sind die Parameter SL und TP = 200 und 200

In den Intervallen "2)" und "3)", SL und TP = 100 und 100


Das Problem: Der Algorithmus fixiert den Gewinn NUR AUF DEN AKTUELLEN SWITCH, aber wir müssen die Gewinnmitnahme-Bedingung für n weitere Candlesticks (mindestens 10-15) beibehalten
Chartperiode 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:

Das Problem: Der Algorithmus legt den Gewinn NUR FÜR DEN AKTUELLEN WECHSEL fest, aber wir müssen die Gewinnmitnahmebedingung für n-Kurven (mindestens 10-15) beibehalten.

M5 Kartenperiode

Die SL- und TP-Aktion ist im Code zeitlich begrenzt. Getrennte SL und TP für Siesta und getrennte SL und TP für Siesta

 
Alexey Belyakov:

Guten Tag, liebe Programmierer! Seit einem Tag kämpfe ich mit einem Problem, und ich kann es nicht lösen. Bitte helfen Sie mir, das Problem zu lösen.

Können Sie die Laufzeit und die Anzahl der Takte ändern?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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
  }
 
Vielen Dank an MakarFX! Es funktioniert, wie es sollte!
 
Alexey Belyakov:
Vielen Dank an MakarFX! Jetzt funktioniert es wie es soll!

Gern geschehen)

Grund der Beschwerde: