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

 

ポジションボリュームを0(ゼロ)にするには?(FORTS, オトクリティブローカー, リアル)

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

#property strict
long     gTicks=0;
int      Step=0;
//=====
void OnTick()
{
   gTicks++;
   PositionSelect(_Symbol);
   //-----
   {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))
   //-----
   {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))        
   //-----   
   {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:

ポジションボリュームを0(ゼロ)にするには?(FORTS, オトクリティブローカー, リアル)

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

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

0(ゼロ)を期待し、1(ワン)を持つ。ログは以下(以下から始まる)。

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

ご清聴ありがとうございました。隣のスレッドで解説してもらいました。:-)
 
Alexey Viktorov:
まさにその通りです。この式を書いたとき、私のSLはあらかじめ定義された値ではなく、注文の開始価格と あるレベルとの差として計算されていたので、リスク量に_Pointを掛ける必要がありました。
それなら、掛け算ではなく、割り算にした方がいい。
 

皆さん、こんにちは!私はある問題に対処できないでいます...。マーチンゲール(2SS)のExpert Advisorがありましたが、ほぼ全て作り直したので、今はトレンドで開くこともできます。個別に決済された注文の累積利益をカウントするブロックがあり、シリーズ全体が決済され、特に1番目の新規注文が決済されたときに「0」にリセットされました。さて、この1stオーダーはいつ終了するかわからない...。そして、蓄積された利益は無効化される。TASK: このフラグが「出現」した後、すべての注文が終了するまで、このフラグ(一連のオープン)を保持する。ソースコードでは、こんな感じでした。

  if(OrderSelect(TicketB[totb-1],SELECT_BY_TICKET)) TimeB=OrderOpenTime();
  if(OrderSelect(TicketS[tots-1],SELECT_BY_TICKET)) TimeS=OrderOpenTime();
.......//...........//...........//............//............//........
         if(!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;
         if((OrderOpenTime()<TimeB || totb==0) && (OrderOpenTime()<TimeS || tots==0)) break;
         if(OrderSymbol()==Symbol())
           {
            if((OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicbuyTrEnd) && OrderType()==OP_BUY  && OrderOpenTime()>TimeB) ProfitBuyN  += OrderProfit()+OrderSwap()+OrderCommission();
            if((OrderMagicNumber()==magicsell || OrderMagicNumber()==magicsellTrEnd) && OrderType()==OP_SELL && OrderOpenTime()>TimeS) ProfitSellN += OrderProfit()+OrderSwap()+OrderCommission();
           }

ありがとうございました。

 
Artyom Trishkin:
それから、掛け算ではなく、割り算。
私のバリエーションをよく見ていないようですね。確かに正しいバリエーションですが、私はストップを掛けず、資金を掛けました。5~6年後には無理があるように思えますが、結果は正しいのです。私はこれらの年のすべてのこのバリアントに戻っていない、私はほとんどこれが行われるExpert Advisorを発見した。私が見つけた時には、すでに2つの記事を書いていましたね :)))
 
Alexey Viktorov:
私のバリエーションをよく見ていないようですね。確かに正しいバリエーションですが、私はストップをかけず、お金をかけました。5~6年後には無理があるように思えますが、結果は正しいのです。私はこれらの年のすべてのこのバリアントに戻っていない、私はほとんどこれが行われるExpert Advisorを発見した。私が見つけた時には、すでに2つの記事を書いていましたね :)))

しかもスマートフォンから ;)

もちろん、不思議なことです。ストップ値をpipsで書くと、(彼の例では)300になります。彼はそれを_Pointに掛けました。 その結果、5桁の相場でのストップ値(pips)は300*0.00001=0.003となりました。

オッケーです。必要な終値と 建値の差が0.003に等しい(価格では)なら、なぜそれを掛けて0.00000003ポイントになったのでしょう?割っていれば、当然のように300はもらえたはずだ。

実は、最初の質問者ではなく、あなたに答えていることに気づかず、スマートフォンから回答してしまったのです ;)

 
Artyom Trishkin:

しかもスマートフォンから ;)

もちろん、不思議なことです。ストップ値をpipsで書くと、(彼の例では)300になります。彼はそれを_Pointに掛けました。 その結果、5桁の相場でのストップ値(pips)は300*0.00001=0.003となりました。

オッケーです。必要な終値と 建値の差が0.003に等しい(価格では)なら、なぜそれを掛けて0.00000003ポイントになったのか?割っていれば、そのまま300になったはずだ。

実は、最初は質問者ではなく、あなたに答えていることに気づかず、スマートフォンから回答していました;)

そして今、私はすでに夕食を食べたので、彼が何を手に入れようと気にしない。:)))

要は、お互いが理解し合えたかどうか...。

 
Alexey Viktorov:

そして今、私は夕食を食べたが、彼が何を得ようと気にしない。:)))

大切なのは、あなたと私が理解し合うこと...。

お互いに理解し合えたようで、とても嬉しいです))若輩者の私は、割り算も掛け算もわかりません。情報の提供、記事へのリンク、指での簡単な説明、宜しくお願いします。
 
Alexey Viktorov:

今、私は夕食を食べたが、彼が何を得ようと気にしない。:)))

要は、あなたと私が理解し合えればいいのですが...。

私はそれを得たと思います、諸君)))

double Test=100/(300*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE));

そういうことです、皆さんありがとうございました)

 
PabloEs:

私はそれを得たと思います、諸君))

double Test=100/(300*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE));

そういうことです、皆さんありがとうございました)

ほら、私は夕食を食べたのに、あなたは11分で仕上げてくれました。:)))
理由: