フォルツァ執行上の問題点 - ページ 58

 
Andrey Khatimlianskii:
そう、ネットワーク・レイテンシーです。そして、注文の送信(確認)に時間がかかり、イベントが無くなってしまうのです。

いいえ、そんなことはありません!

1. これは「ネットワーク」の遅延ではなく、MT5サーバーの遅延です(ブローカーのハードウェアかも しれません)。

2.TradeTransactionは常に失われるわけではない(ALWAYS)、上記のように、遅延は409ミリ秒で イベントは失われない

だから、遅延の原因はネットワークではなく、MT5サーバー(ブローカーのハードウェア)だと主張して いるのです。

CheckOrders()関数のサーバー応答時間は、700~1200msです。

タイマー(期間500ms)のどの時点でコマンドが送信されたか)、これは通常モード(私の設定)での実行時間(7-9ms)の100倍の長さです。

18msの遅延ではイベントが失われ、409msでは失われないことから、これはMT5サーバーの「バグ」であり、他の

の原因となります。

また...私の家に住んでいる友人は、 私のロボットと2つの端末で、家の中の同じルーターを通じてISPで 取引しているのですが、なぜか彼は

その時、レイテンシーな!

2015.10.22 14:14:05.041 Trades 'xxxxx': modify order #22486145 buy limit 2.00 ED-6.16 at 1.1326 sl: 0.0000 tp: 0.0000 -> 1.1332, sl: 0.0000 tp: 0.0000
2015.10.22 14:14:05.049 Trades 'xxxxx': modify order #22486145 buy limit 2.00 ED-6.16 at 1.1326 sl: 0.0000 tp: 0.0000 -> 1.1332, sl: 0.0000 tp: 0.0000 placed for execution in 8 ms
2015.10.22 14:14:38.389 Trades 'xxxxx': cancel order #22486314 sell limit 2.00 Eu-12.16 at 82867
2015.10.22 14:14:38.397 Trades 'xxxxx': cancel order #22486314 sell limit 2.00 Eu-12.16 at 82867 placed for execution in 8 ms
 
マイケルさん、書き込みを編集しないでください。更新を目で探さなくていいように、新しいものを追加したほうがいい。
 
Andrey Khatimlianskii:
マイケルさん、書き込みを編集しないでください。新しいものを追加したほうがいい、目で更新を探さなくていい。
間違いが多かったので、修正しました...。
 
akuloff:

何?

スクリプトは削除前に各注文に対してOrderSelectを行い、もしそれが選択されていれば、履歴になくアクティブであることを意味します、エラーは何ですか?

1つのオーダーを削除した後、残りの未処理のオーダーの番号を1つずつシフトする。
 
Yury Kirillov:
1つのオーダーを削除した後、残りの未処理のオーダーの番号を1つずつシフトする。
ずいぶん前に整理された...。
 

マイケル、またディレイを使った「シート」を作ろうよ、つまらなくなっちゃうよ。:))))

オープニングには、いつ行くのですか?:)))))))

 
Expert Advisorについて質問です。ポジションをゼロにする方法(FORTS、Otkrytie-Broker、Real)

次のようなコードがあります。

#property strict
long     gTicks=0;
int      Step=0;
//=====
void OnTick()
{
   gTicks++;
   PositionSelect(_Symbol);
   //----- Блок 1
   {if((gTicks>1000)&&(Step==0))
   {
      Print("OPEN>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                        " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                        " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                        " *** OrdersTotal()=",OrdersTotal());
      MqlTradeRequest request={0};                                   //Обнулим записи запроса
      MqlTradeResult result={0};                                     //Обнулим записи ответа
      request.action=TRADE_ACTION_PENDING;                           //Отложенный ордер
      request.symbol=_Symbol;                                        //Инструмент
      request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);            //Прайс (цена) исполнения ордера
      request.type=ORDER_TYPE_SELL_STOP;                             //Тип ордера
      request.type_filling=ORDER_FILLING_RETURN;                     //Разрешить исполнять частями (ORDER_FILLING_RETURN)
      request.type_time=ORDER_TIME_SPECIFIED_DAY;                    //В очереди до экспирации
      request.expiration=
         (datetime)SymbolInfoInteger(_Symbol,SYMBOL_EXPIRATION_TIME);//Время истечения фьючерсного контракта
      request.volume=1;                                              //Объем
      Print("OPEN OrderSend=",OrderSend(request,result));
      Print("OPEN Retcode=",result.retcode);
      Print("OPEN Order=",result.order);
      Print("OPEN Deal=",result.deal);
      Print("OPEN OrdersTotal()=",OrdersTotal());
      Print("OPEN Volume=",PositionGetDouble(POSITION_VOLUME));
      Step=1;
      return;
   }}//if((gTicks>1000)&&(Step==0))
   //----- Блок 2
   {if((gTicks>2000)&&(Step==1))
   {
   Print("CLOSE>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                     " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                     " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                     " *** OrdersTotal()=",OrdersTotal());
      MqlTradeRequest request={0};                                   //Обнулим записи запроса
      MqlTradeResult result={0};                                     //Обнулим записи ответа
      request.action=TRADE_ACTION_DEAL;                              //Отложенный ордер
      request.symbol=_Symbol;                                        //Инструмент
      request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);            //Прайс (цена) исполнения ордера
      request.type=ORDER_TYPE_BUY;                                   //тип ордера
      request.type_filling=ORDER_FILLING_FOK;                        //Исполнять только в полном объёме
      request.type_time=ORDER_TIME_DAY;                              //В очереди до снятия
      request.volume=1;                                              //Объем Правильно
      Print("CLOSE OrderSend=",OrderSend(request,result));
      Print("CLOSE Retcode=",result.retcode);
      Print("CLOSE Order=",result.order);
      Print("CLOSE Deal=",result.deal);
      Print("CLOSE OrdersTotal()=",OrdersTotal());
      Print("CLOSE Volume=",PositionGetDouble(POSITION_VOLUME));
      Step=2;
      return;
   }}//if((gTicks>2000)&&(Step==1))        
   //----- Блок 3
   {if((gTicks>3000)&&(Step==2))
   {
      Print("INFO>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                        " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                        " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                        " *** OrdersTotal()=",OrdersTotal());
      Step=3;
      return;
   }}//if((gTicks>3000)&&(Step==2))
   {if((gTicks>4000)&&(Step==3))
   {
      ExpertRemove();
   }}//if((gTicks>4000)&&(Step==3))
}//OnTick()

つまりある注文でポジションを建て、逆の注文で決済し、その結果としてのポジションの出来高を 見るのである。

私たちは0(ゼロ)を期待し、1(ワン)を手に入れたのです。ログは以下の通りです(一番下から)。

2015.10.27 16:28:11.476 2015.10.26 10:05:08   ExpertRemove() function called
2015.10.27 16:28:11.465 2015.10.26 10:03:14   INFO>> *** VOLUME=1.0 *** ID=2 *** TYPE=POSITION_TYPE_SELL *** OrdersTotal()=0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Volume=1.0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE OrdersTotal()=0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Deal=3
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Order=3
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Retcode=10009
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE OrderSend=true
2015.10.27 16:28:11.449 2015.10.26 10:01:47   order performed buy 1.00 at 9249 [#3  buy 1.00 SBRF-12.15 at 9249]
2015.10.27 16:28:11.449 2015.10.26 10:01:47   deal performed [#3  buy 1.00 SBRF-12.15 at 9249]
2015.10.27 16:28:11.449 2015.10.26 10:01:47   deal #3  buy 1.00 SBRF-12.15 at 9249 done (based on order #3)
2015.10.27 16:28:11.449 2015.10.26 10:01:47   exchange buy 1.00 SBRF-12.15 at 9249 (9242 / 9249 / 9242)
2015.10.27 16:28:11.449 2015.10.26 10:01:47   CLOSE>> *** VOLUME=1.0 *** ID=2 *** TYPE=POSITION_TYPE_SELL *** OrdersTotal()=0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   order performed sell 1.00 at 9205 [#2  sell stop 1.00 SBRF-12.15 at 9205]
2015.10.27 16:28:11.422 2015.10.26 10:00:57   deal performed [#2  sell 1.00 SBRF-12.15 at 9205]
2015.10.27 16:28:11.422 2015.10.26 10:00:57   deal #2  sell 1.00 SBRF-12.15 at 9205 done (based on order #2)
2015.10.27 16:28:11.422 2015.10.26 10:00:57   order [#2  sell stop 1.00 SBRF-12.15 at 9205] triggered
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Volume=0.0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN OrdersTotal()=1
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Deal=0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Order=2
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Retcode=10009
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN OrderSend=true
2015.10.27 16:28:11.422 2015.10.26 10:00:57   sell stop 1.00 SBRF-12.15 at 9205 (9205 / 9227 / 9205)
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN>> *** VOLUME=0.0 *** ID=0 *** TYPE=POSITION_TYPE_BUY *** OrdersTotal()=0
2015.10.27 16:28:11.344 SBRF-12.15,M1: testing of Experts\Projects\CoinAge5\Helper_v01\mq5\Tst\TST006_Open_Close_Positions_001.ex5 from 2015.10.26 00:00 to 2015.10.27 00:00 started

その理由は 何でしょうか。

 
Yury Kirillov:
ここで、目利きの方に質問です。ポジションをゼロにする方法(FORTS、Otkrytie-Broker、Real)

次のようなコードがあります。

つまりある注文でポジションを建て、逆の注文で決済し、その結果としてのポジションの出来高を 見るのである。

私たちは0(ゼロ)を期待し、1(ワン)を手に入れたのです。ログは以下の通りです(一番下から)。

その理由は 何でしょうか。

もっとシンプルでいいんじゃないですか?

#include <Trade\Trade.mqh>
CTrade Trade;

void OnTick()
{
   Trade.PositionClose(Symbol());
}

?

 
Yury Kirillov:

その理由は 何でしょうか。

あらかじめPositionSelectを 行わずにPositionGetで。
 
Vasiliy Sokolov:

もっとシンプルでいいのでは?

?

いいえ、そんなことはありません。あなたのバージョンでは、私が書いたのではないライブラリを解析しなければならないのに対して、私は自分のコードをそのように扱っています。このライブラリーの中を覗くと、私とほぼ同じ操作のセットがあります。ですから、まずはFORTSで発注する仕組みを理解し、その上で標準の ライブラリを使いたいのかもしれません。

理由: