OnTradeTransaction - ページ 4

 
Andrey Dik:

今までOnTradeTransaction()イベントを処理したことはなく、取引ロジックで何がトリガーになるかを考える必要がなかったため、処理する必要がなかったのです。SLまたはTP。これが私のトレード経験の証拠だとでも言うのでしょうか)))。

よく読んでいるのですが、動作するコードという形で賢明な答えを出している人がいないようです。それとも、偉大なるクソ秘密と偉大なる魔法使い-秘密の知識と何が効果的かを判断する能力-なのでしょうか?

特にFOREXの場合、注文するEAは書きません。

これで、賢明なコードを書くのに必要な知識はすべて揃ったことになります。

お客様のニーズに合わせた

 
prostotrader:

特にFOREXの場合、注文するEAは書きません

これで、賢明なコードを書くために必要な知識はすべて揃ったことになります。

お客様のニーズに合わせた

また、誰に頼まれて注文書を書いたのですか?

この掲示板で質問するということは、いまや注文を書くということなのでしょうか。

地獄に落ちろ、お前ら全員あなたは売り手です。

 
Andrey Dik:

...

また、口座履歴で最後の取引の解説を見れば、OKでしょうか?

そんな感じです。

//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Take Profit               |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByTakeProfit(const string symbol)
  {
//--- Получим комментарий последней сделки на указанном символе
   string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "tp"
   if(StringFind(last_comment,"tp",0)>-1)
      return(true);
//--- Если нет строки "tp"
   return(false);
  }
//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Stop Loss                 |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByStopLoss(const string symbol)
  {
//--- Получим комментарий последней сделки на указанном символе
   string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "sl"
   if(StringFind(last_comment,"sl",0)>-1)
      return(true);
//--- Если нет строки "sl"
   return(false);
  }
//+------------------------------------------------------------------+
//| Возвращает комментарий последней сделки на указанном символе     |
//+------------------------------------------------------------------+
string CAccountHistory::LastDealComment(const string symbol)
  {
   int    total_deals  =0;  // Всего сделок в списке выбранной истории
   string deal_symbol  =""; // Символ сделки
   string deal_comment =""; // Комментарий сделки
//--- Если история сделок получена
   if(HistorySelect(0,TimeCurrent()))
     {
      //--- Получим количество сделок в полученном списке
      total_deals=HistoryDealsTotal();
      //--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой
      for(int i=total_deals-1; i>=0; i--)
        {
         //--- Получим комментарий сделки
         deal_comment=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT);
         //--- Получим символ сделки
         deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
         //--- Если символ сделки и текущий символ равны, остановим цикл
         if(deal_symbol==symbol)
            break;
        }
     }
//---
   return(deal_comment);
  }
 
Anatoli Kazharski:

また、口座履歴で最後の取引の解説を見ればOKでしょうか?

そんな感じです。

親切な方、ありがとうございます。

SLとTPが滑ることがあり、価格を比較しても意味がないことを考えると、おそらく最も確実な方法でしょう。

 
Anatoli Kazharski:

また、口座履歴で最後の取引の解説を見ればOKでしょうか?

そんな感じです。


もし、解説がなかったら(これは十分にあり得ることですが)?

 
Andrey Dik:

SLやTPが滑ることもあり、価格比較は意味がないことを考えると、これが一番確実な方法でしょう。

なーんだ、この方式はダメなのか
   static int GetOrderType(const ulong OrderTicket)
     {
      int OrderType=(int)::HistoryOrderGetInteger(OrderTicket,ORDER_TYPE);

      if((OrderType==ORDER_TYPE_BUY) || (OrderType==ORDER_TYPE_SELL))
        {
         const string OrderComment=HistoryOrderGetString(OrderTicket,ORDER_COMMENT);
         const string OrderPrice=::DoubleToString(::HistoryOrderGetDouble(OrderTicket,ORDER_PRICE_OPEN),
                                                  (int)::SymbolInfoInteger(HistoryOrderGetString(OrderTicket,ORDER_SYMBOL),SYMBOL_DIGITS));

         if(OrderComment=="tp "+OrderPrice)
            OrderType=ORDER_TYPE_TAKEPROFIT;
         else if(OrderComment=="sl "+OrderPrice)
            OrderType=ORDER_TYPE_STOPLOSS;
        }

      return(OrderType);
     }
 
prostotrader:

コメントがない場合はどうするのか(これは十分にあり得ることだが)。

もちろん、かなり可能性があります。テスターで履歴を解析するときに、一番簡単で早いので、これを使っています。

この場合、私は保留中の注文で チケットを作成し、分析する必要があります。手元に用意できる例がない。

 
古くからある問題

ポジションをクローズ した後にMQL5経由でそのtakeprofitとstoplossの 値を知ることはできないのです。


これは無差別に非難しているのではなく、何時間もかけて、すべてがどのように動くのか(HistorySelectByPositionやその他のものは役に立ちません)を見つけようとした結果なのです。そして、もし間違っていたら、喜んで謝ります。杞憂ではなく、RoboForexEU-MetaTrader5サーバーでテスター用のExpert Advisor(その方がわかりやすい)を表示しており、ポジションを開いてからSLとTPレベルをつけています。

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

このEAでは、(OnDeinitで)1つのクローズポジションのSLとTPを定義することはできません。そういうものなのでしょうか?

クローズドポジションのSLと TPの定義 - 解決できるのは誰ですか?
 
Anatoli Kazharski:

もちろん、かなり可能性があります。テスターでの履歴の解析は、一番簡単で早いのでこれを使っています。

そして、保留中の注文では、チケットの実行と分析が必要です。手元に既成の例がないのです。

この方法のどこが合わなかったのでしょうか?

case TRADE_TRANSACTION_DEAL_ADD:
  if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break;
 
prostotrader:

この方法の何が問題なのでしょうか?

case TRADE_TRANSACTION_DEAL_ADD:
  if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break;
ええ、だいたいそんな感じです。ただ、まだそのようなテストはしていません。