成行注文を正しく発注するにはどうしたらよいですか? - ページ 5

 
Gennady Mazur:

先日、注文の再開についてトピックを立てました。1週間ほど順調に動作していたので、問題は解決したと思っていました。しかし、今日、開くときだけ同じような問題が発生しました。
Finamでは多くの注文が、Otkritieでは9つの注文が開きました...いずれも1つの注文しか開いていないはずですが。

以下は、EAからのコードスニペットです。

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

つまり、操作が成功すれば、変数OpenOrdersが 増加し、最初は0に なることがコードからわかる。

0より大きい場合は、それ以上の注文のオープンはないはずですが、Order1というコメントで注文の山全体がオープンされます。

注文を 開く関数で肯定的な応答があるかどうか、注文チケットが届いているかどうかをチェック しますが、実際には注文が設定されているにもかかわらず、なぜかこの関数はfalseを返します。

何が問題なのか、どうすれば解決できるのかを説明してください。

さらに、ポジションを選択してみることで、そのポジションの開き具合を確認することができます。そして、何度かトライするのがよいでしょう。

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
遅延と、すでにその位置にあることの確認の両方があります。

また、OrderCheck(Request, checkResult)のチェックがないのもまずいことに気がつきました。
 

あ、あとマーケットオーダーで価格=0にすることも

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 忘 れてください。

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
 
Alexey Viktorov:
また、実際に選択してみることで、ポジションの開き具合を確認することも可能です。そして、何度か試してみるのがよいでしょう

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
遅延と、すでにポジションが開いていることの確認の両方があります。

また、OrderCheck(Request, checkResult)のチェックがないのもまずいことに気がつきました。

もし、そのポジションがすでに存在していたとしたら?

あるいは、すでにポジションがあるにもかかわらず、注文が完全に満たされていない場合は?

 
Alexey Viktorov:
また、実際に選択してみることで、ポジションの開き具合を確認することができます。そして、何度か試行錯誤を重ねた方が良い。

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
遅れていることと、すでに位置が確定していることの両方があります。

また、OrderCheck(Request, checkResult)のチェックがないことに気がつきましたが、これはまずいですね。

まあ、多分私はOrderCheck(Request, checkResult)を挿入します
ありがとうございました。

しかし、私はこのようなループは特に好き ではありません。

 
prostotrader:

あ、あとマーケットオーダーで価格=0にすることも

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 忘 れてください。

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
こんなに詳しい説明...本当にありがとうございます...。
そして、価格についてですが、そうですね、MT4の方が慣れていますし、そこでは常に価格を入れなければならないので...。
 
Sergey Chalyshev:

繰り返し

それとは別に、注文の状況や 履歴にすでに表示されているかどうかも確認する必要があります。

取引所はポジションを扱わず、注文のみを扱います。

そうなんですか?
 
Gennady Mazur:
私が保留中の注文を置くならば、あなたは正しいですが、私は市場によって動作し、ここでチケットはResults.dealで 取得されます。
それでも、まず注文が送られ、次に実行される。
 
Sergey Chalyshev:

あなたの笑顔の意味がわからないのですが?

まさか、そんなことを言われるとは。何がポーズだ、冗談だろう?

OrderSend()の 後、マーケット情報と履歴を更新できるように一時停止する。
 
Sergey Chalyshev:

悪いFXの遺産。

...

言い回しには気をつけたほうがいいかもしれませんね。そうでなければ、FOORTSの信奉者の遺伝子変異について話したほうがいいかもしれません。
 
Sergey Chalyshev:

もし、そのポジションがすでに存在していたとしたら?

それとも、すでにポジションはあるが、オーダーが完全に満たされていないのでしょうか?

ああ、それに俺は生け垣が大事なんだ。確かに私は、ちょっとおかしいと思いました。あるいは全く間違っている。:-)
理由: