MT5でOrderSendを正しく動作させる方法 - ページ 2

 
fxsaber:
これはもう専門用語の議論ですね。悪い状況は、上記で詳しく説明したとおりです。標準的なライブラリは、それすら考慮していない。

いいえ。

でも、粘り強く続けてください。これ以上の説明は省きます。

 
Renat Fatkhullin:

いいえ。

でも、粘り強く続けてください。これ以上の説明は省きます。

掲示板に書いている人もいます。しかも一度だけでなく、何度も。その反応は、まさにその通り。

 
fxsaber:

掲示板に書いている人もいます。しかも一度だけでなく、何度も。反応はこんな感じです。

人は自分で考えようとせず、他人にやってもらいたがるものだ...。残念ながら、これは事実です。
 
prostotrader:

このような災難を回避するお手伝いをしましょうか?(実際の口座でMT5ロボットを使って取引した個人的な経験から)

追加

絶対に無料です :)

自分の分も貯金箱に入れましょう。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

OrderSend()送信後、サーバーの応答待ち。

デニス・サルタコフ さん 2016.10.08 15:43

この関数は同期的に動作するが、この関数の終了に伴い履歴が同期的に更新されることはない。

この方法でやってます、OnTrade()とかいじるより簡単だと思うので。

bool ClosePosition()
{
   if (!PositionSelect(_Symbol))
   {
      return(false);
   }

   bool   b_Result;
   
   b_Result = m_trade.PositionClose(_Symbol,mi_Deviation);
   
   if(!b_Result)
   {
      Print("The PositionClose() method has failed. Return code=",m_trade.ResultRetcode(),
            ". Code description: ",m_trade.ResultRetcodeDescription());
      return(false);
   }
   
   if(b_Result)
   {
      if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         while(PositionSelect(_Symbol))
         {
         }
         
         Print("The PositionClose() has been successfully executed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(true);
      }
      if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE)
      {
         Print("The PositionClose() failed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(false);
      }
   }
   return(false);
}      
//+------------------------------------------------------------------+

 
prostotrader:
人は自分で考えようとせず、他人にやってもらいたがるものだ...。残念ながら、これは事実です。

人々は考えるだけでなく、その解決策を共有する。これについては、残念ながら開発者は沈黙しています。

このトピックに関するドキュメントは一例もありません。そして、これはメイン機能とのことです。

 
fxsaber:

人々は考えるだけでなく、その解決策を共有する。これについては、残念ながら開発者は沈黙しています。

このトピックに関するドキュメントは一例もありません。それもメイン機能で。

上に挙げた例は、失礼ながら全くナンセンスです。

そんなところからスタートするのか!?

 
prostotrader:

上に挙げた例は、失礼ながら全くナンセンスです。

そんなところからスタートするのか!?

私のバリアント

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2016.10.09 09:39

OrderSendが送信された場合、それが行われたことを記憶しておく必要があります(ここが潜在的な脆弱性です)。そして、適切なOnTradeメッセージが届くまで、現在の履歴(取引環境)を無視する。届いたら、REMEMBER to FORGET(忘れることなく)。

REMEMBERがない場合は、MT4と同様に履歴を信頼することができます。


 
//+------------------------------------------------------------------+
//|                                                    OrderSend.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   is_busy=false; 
   order_ticket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!is_busy && (order_ticket==0)) //Только при выполнении данного условия мы продолжаем работать(кроме отложенного ордера)
   {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};
     
     if(PositionSelect(Symbol()))
     {
       if(OrderSend(request, result)
       {
         if(result.retcode==TRADE_RETCODE_PLACED) //для биржи TRADE_RETCODE_PLACED
         {
           if(result.order>0)
           {
             is_busy=true;
             order_ticket=result.order;
             Print("Order plased, ticket = ",result.order);
           }
           else
           {
             Print("Internal error!");
           }  
         }
         else
         {
           //смотрим причину result.retcode
         }
       }
       else
       {
         Print("Order NOT send!");
       }
     }
     else
     {
     }
   }   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//--- В зависимости от того, квкой тип ордера мы устанавливали, смотрим, что с ордером произошло
// и только после полного понимания снимаем флаг is_busy=false; order_ticket=0;
// вот и все премудрости OrderSend
   
  }
//+------------------------------------------------------------------+

活用してください。

 
prostotrader:

使ってみてください。

では、上に書いたこととどう違うのでしょうか。善良な人が、真面目なバイブルまで送ってくれた。

人々は解決策を見いだしています。開発者自身がSBにすら入れてないって話だったんだけどな。

 
fxsaber:

では、上に書いたこととどう違うのでしょうか。優秀な人が真剣にバイブルを落としてくれたこともありました。

人々は解決策を見いだしています。開発者自身がSBにすら入れてないって話だったんだけどな。

嫌なら使うな。