Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 305

 
PokrovMT5:

Guten Abend zusammen, ich habe mich entschlossen, einen Trail auf offene Trades im Tester zu setzen, habe versucht, durch OrderGet....() zu gehen und habe festgestellt, dass das Geschäft von der Kategorie der Orders zu einer offenen Position übergegangen ist, bzw. bin durch PositionGet....() gegangen, aber wieder funktioniert nichts,

Die Frage ist, ob ich jetzt HistoryDealGet...() verwenden sollte? Oder verstehe ich etwas nicht? Wie kann ich SL im offenen Handel im Tester ändern? Vielen Dank im Voraus für Ihre Kommentare.

PositionSelect(Symbol())
 

Bitte verweisen Sie mich auf !!!!, wie man in MQL5 die Prüfung des Vorhandenseins (oder der Abwesenheit) eines grafischen Objekts, z. B. einer Trendlinie oder einer vertikalen Linie, implementiert?

Idealerweise würde ich gerne eine Logik verwenden, die derjenigen von "If Order Does Not Exist" oder "If Order Exists" ähnelt.

 
aleks557:

Bitte verweisen Sie mich auf !!!!, wie man in MQL5 die Prüfung des Vorhandenseins (oder der Abwesenheit) eines grafischen Objekts, z. B. einer Trendlinie oder einer vertikalen Linie, implementiert?

Idealerweise würde ich gerne eine Logik verwenden, die derjenigen von "If Order Does Not Exist" oder "If Order Exists" ähnelt.

https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
pako:
Ich danke Ihnen! Alles funktioniert )).
 

Können Sie mir sagen, wie man den Kaufalgorithmus korrekt implementiert?

Im Moment muss der Expert Advisor viele Male kaufen, bis er die Information erhält, dass es offene Positionen gibt, und er hinkt hinterher. Wie lässt man den Expert Advisor nach dem ersten Kauf (wenn die Bedingungen eintreten) auf die Reaktion der Börse warten?

Das Problem ist nun, dass die Variable Bye_opened true werden sollte und dies den EA davon abhalten sollte, unnötige Trades zu machen, bis die Stops ausgelöst werden. Aber das Ändern der Variable Bye_opened dauert eine lange Zeit und der EA hat Zeit, mehrere Tradeszu machen.


Was fehlt in meinem Code? Bitte weisen Sie auf die Unzulänglichkeiten hin.


 //--- Do we have positions opened already?
   bool Buy_opened=false;  // variable to hold the result of Buy opened position
   bool Sell_opened=false; // variables to hold the result of Sell opened position

   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //It is a Buy
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if(last_tick.last < BBLow[2] && Buy_opened == false)
        {
        int znak = last_tick.last - BBLow[2];

      //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={0};            // Инициализация структуры торгового запроса
         Trade_reqst.action=TRADE_ACTION_DEAL;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol=_Symbol;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TakeProfit*_Point; // Цена исполнения
         Trade_reqst.type=ORDER_TYPE_BUY;            // Тип ордера: на продажу
         Trade_reqst.type_filling=ORDER_FILLING_RETURN; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point;  // Stop Loss
         Trade_reqst.tp=SymbolInfoDouble(_Symbol,SYMBOL_ASK) + TakeProfit * _Point; // Take Profit
      // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
      //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={0};             // Инициализация структуры результата торгового запроса
         OrderSend(Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if(Trade_reslt.retcode==10016) Print("Ответ: ",Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);
 
mavar:

Das Problem ist nun, dass die Variable Bye_opened true werden sollte und dies den EA davon abhalten sollte, unnötige Trades zu machen, bis die Stops ausgelöst werden. Aber Änderungen der Variable Bye_opened dauern lange und EA hat Zeit, mehrere Tradeszu machen.

Nur weil eine Variablenänderung lange dauert... Wie haben Sie das festgestellt? Okay, nehmen wir an, dass es so ist. Dann liegt die Antwort in der Frage. Wenn Sie eine Verzögerung beim Öffnen einer Position benötigen, müssen Sie Sleep( N ) verwenden, wobei N experimentell berechnet wird.

Variante 2. Die Antwort liegt wiederum in der Frage. Machen Sie Bye_opened global und ändern Sie es sofort, nachdem die Position erfolgreich geöffnet wurde, direkt in diesem Modul. Setzen Sie auf die gleiche Weise zurück, wie Sie das Vorhandensein der Position prüfen.

 
papaklass:
...

Wenn Sie eine Zeile einfügen

nach dem Befehl: OrderSend(), werden keine Positionen neu eröffnet.

Vielleicht ist es besser, erst zu prüfen, ob die Position geöffnet wurde, und dann ...

???

 
papaklass:

Offenbar hat er einen Roboter, der bei jeder Zecke läuft. Zwischen dem Senden der Order an den Server und dem Erhalt der Antwort vom Server werden mehrere Ticks hinzukommen, und für jeden Tick wird eine zusätzliche Position eröffnet. Mein Vorschlag schließt die Situation der Wiederholung von Eröffnungen aus. Und es muss überprüft werden, ob eine Position geöffnet wurde oder nicht.

Das ist es, was ich meine. Andernfalls werden sie buchstäblich alles verstehen und eine wichtige Prüfung verpassen.
 
artmedia70:
Das ist es, was ich damit sagen will. Andernfalls würde es buchstäblich alles verstehen und eine wichtige Prüfung verpassen.

Das ist also die korrekte Vorgehensweise bei der Prüfung? Tut mir leid, ich kann es nicht richtig machen.

Hier ist der Code (der sich im OnTick-Block befindet):


void OnTick()
  {

      MqlTick last_tick;
     
      if(SymbolInfoTick(Symbol(),last_tick))
        {
        // Print(last_tick.time,": Bid = ",last_tick.bid,
        //       " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume, "  LastPrice = ",last_tick.last );
        }
      else Print("SymbolInfoTick() failed, error = ",GetLastError());
      //---
      
        //---Читаем свечку
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(Symbol(),0,0,1,rates);
   if(copied>0)
     {
      //Print("Скопировано баров: "+copied);
      string format="open = %G, high = %G, low = %G, close = %G, volume = %d";
      string out;
      int size=fmin(copied,10);
      for(int i=0;i<size;i++)
        {
         //out=i+":"+TimeToString(rates[i].time);
         out=out+" "+StringFormat(format,
                                  rates[i].open,
                                  rates[i].high,
                                  rates[i].low,
                                  rates[i].close,
                                  rates[i].tick_volume);
        // Print(out);
       
         //Print(rates[i].open - rates[i].close );

        }
     }
   else Print("Не удалось получить исторические данные по символу ",Symbol());

//---=======-----\_____BOLLINGER____/--------========--//
//--- получить хэндл индикатора Bollinger Bands и DEMA
      BolBandsHandle=iBands(NULL,my_timeframe,bands_period,bands_shift,deviation,PRICE_LOW);
      ChartIndicatorAdd(0,0,BolBandsHandle);
   
//--- копируем новые значения индикаторов используя хэндлы
   if(CopyBuffer(BolBandsHandle,0,0,3,BBMidle)<0 || CopyBuffer(BolBandsHandle,1,0,3,BBUp)<0
      || CopyBuffer(BolBandsHandle,2,0,3,BBLow)<0)
     {
      Alert("Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:",GetLastError(),"!!");
      return;
     }
//********** это цикл надо добавить в код советника, выводит значения при наступлении нового бара
   //for(int nbar=0; nbar < 3; nbar++)
    // Print("nbar=", nbar, "  BBLow[nbar]=", DoubleToString(BBLow[nbar], _Digits), "  BBMidle[nbar]", DoubleToString(BBMidle[nbar], _Digits),
   //                 "  BBUp[nbar]=", DoubleToString(BBUp[nbar], _Digits));
      
      
  //--- Define some MQL5 Structures we will use for our trade
   MqlTick latest_price;      // To be used for getting recent/latest price quotes
   
       
   //--- Do we have positions opened already?
   bool Buy_opened=false;  // variable to hold the result of Buy opened position
   bool Sell_opened=false; // variables to hold the result of Sell opened position

   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //It is a Buy
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if(last_tick.last < BBLow[2]-natyajka && Buy_opened == false)
        {
        int znak = last_tick.last - BBLow[2];

      //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={0};            // Инициализация структуры торгового запроса
         Trade_reqst.action=TRADE_ACTION_DEAL;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol=_Symbol;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TakeProfit*_Point; // Цена исполнения
         Trade_reqst.type=ORDER_TYPE_BUY;            // Тип ордера: на продажу
         Trade_reqst.type_filling=ORDER_FILLING_RETURN; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point;  // Stop Loss
         Trade_reqst.tp=SymbolInfoDouble(_Symbol,SYMBOL_ASK) + TakeProfit * _Point; // Take Profit
      // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
      //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={0};             // Инициализация структуры результата торгового запроса
         OrderSend(Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if(Trade_reslt.retcode==10016) Print("Ответ: ",Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);

//--- вернем код ответа торгового сервера
        Print("Покупаю. Buy_opened = ", Buy_opened);
        Print( "last_tick.last= ", last_tick.last, 
               " last_tick.ask= ", last_tick.ask, " - ",    
               " BBLow= ",DoubleToString(BBLow[2], _Digits) , 
               " SYMBOL_BID=", SymbolInfoDouble(_Symbol,SYMBOL_BID),
               " SYMBOL_ASK=", SymbolInfoDouble(_Symbol,SYMBOL_ASK), 
               " StopLoss=", StopLoss,
               " TakeProfit=", TakeProfit,
               " Trade_reslt.bid=", Trade_reslt.bid,
               " Trade_reslt.bid=", Trade_reslt.bid,
               " Trade_reslt.ask=", Trade_reslt.ask
            ); 

      
   //return Trade_reslt.retcode;

         
        }

  } 
 
papaklass:

Um das Öffnen unnötiger Bände zu vermeiden:

Leider funktioniert diese Bedingung bei der Eröffnung eines Handels nicht.

      //проверка выполнения торгового приказа
      if(Trade_reslt.retcode==10009)   //заявка выполнена
      {
         Bye_opened = true;
      }

Grund der Beschwerde: