初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 305

 
PokrovMT5:

皆さんこんばんは!テスターでオープントレードにトレールをつけることにして、OrderGet...()を通してみて、取引がオーダーのカテゴリーからオープンポジションに なったことに気付き、それぞれPositionGet...()を通してみましたが、やはり何も動きません。

問題は、HistoryDealGet...()を使うべきかどうか?それとも、私が何か理解していないのでしょうか?テスターでオープントレードのSLを変更するにはどのようにすればよいのでしょうか?コメントありがとうございました。

PositionSelect(Symbol())
 

MQL5で、トレンドラインや 垂直線などのグラフィカルなオブジェクトの有無のチェックを実装する方法を教えてください。

理想としては、「注文がない場合」「注文がある場合」のようなロジックを使い たいですね。

 
aleks557:

MQL5で、トレンドラインや 垂直線などのグラフィカルなオブジェクトの有無のチェックを実装する方法を教えてください。

理想は「注文がない場合」「注文がある場合」のようなロジックに することです。

https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
pako:
ありがとうございました。すべてうまくいく )).
 

購入アルゴリズムを正しく実装する方法を教えてください。

現時点では、Expert Advisorは、オープンポジションが あるという情報を受け取るまで、何度も買いを入れなければならず、遅れをとっています。Expert Advisor で最初の買いの後(条件が揃った時)、為替反応を待たせる方法
.

問題は、Bye_openedという 変数がtrueに なることで、ストップがトリガーされるまでEAが不必要な取引をしないようにしなければならないことです。しかし、変数Bye_opened を変更すると 時間がかかり EA はいくつかのトレードをする時間が あります.


私のコードには何が欠けているのでしょうか?欠点をご指摘ください。


 //--- 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:

問題は、Bye_openedという 変数がtrueに なることで、ストップがトリガーされるまでEAが不必要な取引をしないようにしなければならないことです。しかし、変数Bye_opened の変更には 長い時間がかかり EA はいくつかのトレードを行う時間が あります.

変数変更に時間がかかるからって...。どうしてそう判断したのですか?よし、そうだと仮定しよう。ならば、その答えは問いの中にある。もし、ポジションを開く のに遅延が必要な場合は、Sleep( N ) を使用する必要があります。

バリエーション2。その答えは、やはり質問の中にある。Bye_openedをグローバルにし、ポジションが正常に開かれた直後に、このモジュール内で変更します。位置の有無を確認するのと同じように、リセットしてください。

 
papaklass:
...

行を挿入した場合

コマンド:OrderSend()の後、ポジションの再開はありません。

先にポジションが開いているかどうかを確認して、それから・・・の方がいいかもしれませんね。

???

 
papaklass:

どうやら、刻々とロボットを走らせているようです。注文をサーバーに送信してからサーバーからの応答を受信するまでの間に、さらに数ティックが訪れ、各ティックで追加のポジションがオープンします。私の提案は、開封の繰り返しの状況を排除するものです。そして、ポジションがオープン されたかどうかを確認する必要があります。

そういうことなんです。そうでないと、文字通りすべてを理解した上で、重要な確認を怠ってしまうことになります。
 
artmedia70:
そういうことなんです。そうしないと、文字通りすべてを理解してしまい、重要なチェックを見逃してしまうからです。

これが実は正しいチェック方法なんですね。すみません、うまくいきません。

以下はそのコードです(すべてOnTick ブロック内にあります)。


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:

不要なボリュームを開けないようにするためです。

残念ながら、この条件は取引開始時には機能しません。

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

理由: