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

 
Vladimir Karputov:

取引注文の 執行後、注文ではなくポジションが表示される!

そのような状況を再現できるサーバーがあります

PositionGetTicket(0) = 73401069 
PositionSelect(_Symbol) = true 
OrderGetTicket(0) = 73401069 
PositionsTotal() = 1
OrdersTotal() = 1, ORDER_STATE_STARTED


つまり、次のような順番で端末に同時に入って いるのです。

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0


と同じ位置から

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0
 
Vladimir Karputov:

だから、まず自分が何をしているのか、何を得たいのかを言葉で表現してください。ORDERの代わりに「買付取引注文」「売付取引注文」を使用します。その結果、「買いポジション」または「売りポジション」になります。

以下はMQL4で書かれたコードですが、テスター版、つまり最小限のチェックなどに興味があります。

//+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

int ticket1=-1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticket1=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,NormalizeDouble(Ask-100*_Point,_Digits),NormalizeDouble(Ask+100*_Point,_Digits));

   if(OrderSelect(ticket1,SELECT_BY_TICKET))
     {
      if(OrderCloseTime()>0)
        {
         int cmd=OrderType()==OP_BUY ? OP_SELL : OP_BUY;
         double tp = cmd==OP_BUY ? NormalizeDouble(Ask+100*_Point,_Digits) : NormalizeDouble(Bid-100*_Point,_Digits);
         double sl = cmd==OP_BUY ? NormalizeDouble(Ask-100*_Point,_Digits) : NormalizeDouble(Bid+100*_Point,_Digits);
         ticket1=OrderSend(_Symbol,cmd,0.1,Ask,30,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+

TSの本質:あなたは最初のスタートで買い注文を開き、注文のチケット(チケットでの作業)を覚えているときに、順序が閉じている場合は、チェック - 注文の種類があったと反対の順序を入れて、チケットなどを覚えてラウンドを見てください。

SB CTradeを使用してMQL5で同様の例を再現してほしい。

 
Igor Makanu:

OK、コード内の例に議論を単純化しましょう、ここにMQL4で書かれたコードがあります - 私はテスター用のバージョンに興味があります、すなわち、最小限のチェックなどです。

TSの本質:あなたが最初の開始時に買い注文を開き、注文のチケット(チケットでの作業)を覚えているときに、順序が閉じている場合は、チェック - 注文の種類を見て、反対の順序を置くとチケットなどを覚えているラウンド

SB CTradeを使用してMQL5で同様の例を再現してほしい。

ここで小太鼓が感想を言います))))
 
Alexey Viktorov:
今度はリトルドラマーがあなたのことをどう思っているか教えてくれます))))

しかし、チケット番号がオープンかクローズかを知る必要があります。クローズであれば、クローズしたポジションが どのような種類のトレードオーダー であったかを知る必要があります。

(太字は-とにかく注文です!-TCヘッダーアカウントのため)。

 
Igor Makanu:

私はMQL4でコードを書きましたが、テスターのバージョン、つまりチェックの最小化などに興味があります。

2回目のOrderSendには エラーが含まれています。そして、ノーマライゼーションは不要です。フォーラムでは(に限らず)、コードは短い方が読みやすいのです。
void OnTick()
  {
   static int ticket1 = -1;
   
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-100*_Point,Ask+100*_Point);

   if(OrderSelect(ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd=1-OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : -1) * 100 * _Point;
     double sl = open + (cmd ? 1 : -1) * 100 * _Point;
     ticket1=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
    }
  }

CTrade SBを使用してMQL5で同様の例を再現してほしい。

CTrade SBを使用してMQL5で同様の例を再現して欲しいのですが。

 

つまり、基本はPOSITION_IDENTIFIER ですが、ポジションチケットではありません。これは、ネットだからこそ重要な ことです。

position_identifier

ポジション識別子は一意の番号であり、新しく開設されたポジションに割り当てられ、その生涯を通じて変更されることはありません。ポジションが開設された注文のチケットに対応します。

ポジション識別子は、各注文(ORDER_POSITION_ID)と、それをオープン、変更、クローズした各取引(DEAL_POSITION_ID)に指定されています。このプロパティは、ポジションに関連する注文や取引を検索するために使用します。

ネッティングモード(単一イン/アウト取引)でポジションを反転させる場合、ポジションのPOSITION_IDENTIFIER識別子は変更されません。ただし、POSITION_TICKETは逆転を招いたオーダーチケットに変更されます。ヘッジモードでは、ポジションの反転はありません。


そこで、位置の識別子(POSITION_IDENTIFIER)を記録しておく必要がある。


さて、より正確なタスクです。最初の実行で、買いポジションをオープンし、それを記憶します(警告:チケットではなく、ポジションIDを記憶すべきです)。例えば、昔、買いポジションがあり、それがクローズされた場合、すぐに売りポジションをオープンすることになります。


これで問題解決はかなり楽になる。

 
Vladimir Karputov:

これで問題解決はかなり楽になる。

例文を書くときは、少し先を見て書いて ください。

 
fxsaber:
2回目のOrderSendにはエラーが含まれています。ノーマライゼーションは必要ない。フォーラムでは(に限らず)、コードは短い方が読みやすいんです。

はい、わかりました、私はその場でコードを書きました - テスターで実行 - それは動作し、フォーラムにコピーします。


fxsaber

もうちょっと頑張らないとね。

だからフォーラムで相談したんです!- SB CTradeの能力を推定することにしました。初歩的なタスクを例として取り上げましたが、これまでのところ結果はマイナスでした


ウラジーミル・カルプトフ

これで、問題解決はぐっと楽になるはずです。

フォーラムのアクティブなメンバーとしてあなたを知っています。 私の、というか修正したfxsaberの コードを、MQL5下のCTrade Serverを使って再現していただけませんか?

 
Igor Makanu:

はい、わかりました、私はその場でコードを書きました - テスターで実行 - それは動作し、フォーラムにコピーします。

私はEAを書き始めるとき、いつも白紙から始めます(お勧めします)。おそらく、ほとんどの場合、On-functionsを含むヘッダーから始まります。

 
Igor Makanu:

だからフォーラムで相談したんです!- 私はCTradeの能力を評価することにしました。初歩的なタスクを例として取り上げましたが、これまでのところ結果はマイナスでした。

さらに短い例もあります。

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

mql5言語の特徴、複雑な仕組みとコツ

fxsaber さん 2018.02.15 11:48

OrderCloseBy(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0));

テスターでないとMT5では対応しにくい。

理由: