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

 

うーん、不思議な状況です。私が提起したトピックの活動のように、私の視点から具体的に質問をしたのですが、これまでのところ答えではなく、「なぜそれが必要なのですか?

SB CTradeで 行いたいのですが、以下はその例です(2つの私の例からまとめたもの):9 TFで新しいバーを 1つの注文で開き、チケットを記憶し、チケット番号で閉じた注文の方向を 決定します。

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
input int TP = 100;
input int SL = 100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };

ENUM_TIMEFRAMES  TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
CNewbar *BAR[9];
int ticket[9];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0;i<9;i++) BAR[i]=new CNewbar(TF[i]);
   ArrayInitialize(ticket,-1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i=0;i<9;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<9;i++)
      if(BAR[i].NewBar())
        {
         if(ticket[i]<0) ticket[i]=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-SL*_Point,Ask+TP*_Point);
         if(OrderSelect(ticket[i],SELECT_BY_TICKET) && OrderCloseTime()>0)
           {
            int cmd=1-OrderType();
            double open=cmd ? Bid : Ask;
            double tp = open - (cmd ? 1 : -1) * TP * _Point;
            double sl = open + (cmd ? 1 : -1) * SL * _Point;
            ticket[i]=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
           }
        }
  }

テスターのためのコード、つまり最小限のチェック数とオプティマイザーでの最速の作業が必要です。

SB CTradeを使用してMQL5でこのコードを記述するにはどうすればよいですか?

 
Igor Makanu:

うーん、不思議な状況です。私が提起したトピックの活動のように、私の視点から具体的に質問をしたのですが、これまでのところ答えではなく、「なぜそれが必要なのですか?

SB CTradeで 行いたいのですが、以下はその例です(2つの私の例からまとめたもの):9 TFで新しいバーを 1つの注文で開き、チケットを記憶し、チケット番号で閉じた注文の方向を 決定します。

MQL4では、テスター用のコードは次のようになります。

SB CTradeを使用してMQL5でこのコードを記述する方法は?

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

初心者からのFAQ MQL5 MT5 MetaTrader 5

ウラジミール・カルプトフ 2019.07.21 12:56

つまり、基本はPOSITION_IDENTIFIER であり、ポジションチケットではない。 ネットがあるだけで、重要な んです。

position_identifier

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

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

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


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


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


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


 
Vladimir Karputov:

CTradeは 注文がオープンかクローズかを独自に検出する方法を知らないのですか? 最後にクローズした注文のタイプは何ですか?

この場合、どのライブラリを使用すればよいのでしょうか?

 
Igor Makanu:

CTradeは注文がオープンかクローズかを独自に検出する方法を知らないのですか? 最後にクローズした注文のタイプは何ですか?

そのためには、どのライブラリを使えばいいのでしょうか?

もう100回言ったから、「注文」という言葉を消してください。そうしないと、前に進めないのです。とにかく、私はおそらくあなたのお役に立てないでしょう。それは残念なことです。

 
Vladimir Karputov:

何度も言いますが、"令状 "という言葉は使わないでください。そうしないと、前に進めないんです。とにかく、私はおそらくあなたのお役に立てないでしょう。それは残念です。

では、どういう意味か教えてください。

GN      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Ticket = 20
JF      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Identifier = 0
FQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======closePosition======
HG      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD, close #20 (0.73633 / 0.73637 / 0.73633)
PH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #21  buy 0.10 AUDUSD at 0.73637 done (based on order #21)
 KJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#21  buy 0.10 AUDUSD at 0.73637]
IL      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#21  buy 0.10 AUDUSD at 0.73637]
RN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 position #20  AUDUSD [done at 0.73637]
HN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Позиция с магиком 2544113114312914, тикетом 20 и лотом 0.1 успешно закрыта.
LO      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======checkMargin======
OF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD (0.73633 / 0.73637 / 0.73633)
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #22  buy 0.10 AUDUSD at 0.73637 done (based on order #22)
 RM      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#22  buy 0.10 AUDUSD at 0.73637]
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#22  buy 0.10 AUDUSD at 0.73637]
FF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 AUDUSD [done at 0.73637]
MJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.06.19 16:00:00   balance = 11308.94
JK      0       16:24:14.030    Core 1  2018.06.19 16:00:00   lot = 0.10
HQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Ticket = 22
CJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Identifier = 20
HR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======closePosition======
FI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD, close #22 (0.74021 / 0.74025 / 0.74021)
RF      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #23  sell 0.10 AUDUSD at 0.74021 done (based on order #23)
 ID      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#23  sell 0.10 AUDUSD at 0.74021]
GM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#23  sell 0.10 AUDUSD at 0.74021]
NQ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 position #22  AUDUSD [done at 0.74021]
PO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Позиция с магиком 2544113114312914, тикетом 22 и лотом 0.1 успешно закрыта.
FO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======checkMargin======
OI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD (0.74021 / 0.74025 / 0.74021)
JO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #24  sell 0.10 AUDUSD at 0.74021 done (based on order #24)
 LM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#24  sell 0.10 AUDUSD at 0.74021]
ND      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#24  sell 0.10 AUDUSD at 0.74021]
LI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.74021]
OJ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   balance = 11335.85
DK      0       16:24:14.030    Core 1  2018.07.04 08:00:00   lot = 0.10
PN      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Ticket = 24
QE      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Identifier = 22
NR      0       16:24:14.030    Core 1  2018.07.19 00:00:00   ======closePosition======
NF      0       16:24:14.030    Core 1  2018.07.19 00:00:00   market buy 0.10 AUDUSD, close #24 (0.73968 / 0.73989 / 0.73968)
JI      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal #25  buy 0.10 AUDUSD at 0.73989 done (based on order #25)
 QK      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal performed [#25  buy 0.10 AUDUSD at 0.73989]
MM      0       16:24:14.030    Core 1  2018.07.19 00:00:00   order performed buy 0.10 at 0.73989 [#25  buy 0.10 AUDUSD at 0.73989]
PN      0       16:24:14.030    Core 1  2018.07.19 00:00:00   CTrade::OrderSend: market buy 0.10 position #24  AUDUSD [done at 0.73989]
DO      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Позиция с магиком 2544113114312914, тикетом 24 и лотом 0.1 успешно закрыта.
LP      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Очистка данных произведена.
KK      0       16:24:14.030    Core 1  2018.08.08 16:00:00   ======checkMargin======
RI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   market sell 0.10 AUDUSD (0.73933 / 0.73937 / 0.73933)
GO      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal #26  sell 0.10 AUDUSD at 0.73933 done (based on order #26)
 OM      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal performed [#26  sell 0.10 AUDUSD at 0.73933]
JD      0       16:24:14.030    Core 1  2018.08.08 16:00:00   order performed sell 0.10 at 0.73933 [#26  sell 0.10 AUDUSD at 0.73933]
QI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.73933]
HN      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Ticket = 26
CF      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Identifier = 0
 
Vladimir Karputov:

何度も言いますが、"令状 "という言葉は使わないでください。そうしないと、前に進めないんです。とにかく、私はおそらくあなたのお役に立てないでしょう。それは残念です。

では、質問を変えます。

CTrade::ResultOrder()で記憶されたチケットを使用する方法

をご覧ください。

1.ポジションが閉じているかどうか?

2.クローズドポジションはどのような取引だったのでしょうか?

3.9つのポジション、オーダー、チケットを同時に処理する必要がある、または ...ヘッジ口座のOnAnyTerminology


このような形であれば、私の質問は曖昧なものではありませんね。(上記MQl4での再現例)。

ZS: 語順を忘れるわけにはいきません。残念ながら、この言葉はヘルプで他の用語と一緒に使われています。https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder

 
Igor Makanu:

うーん、不思議な状況です。話題を提供したようで、私の質問は私の立場からすると具体的だったのですが、答えの代わりに「なぜ必要なのでしょうか?

理由は、そうレスポンダーの無能さです。書くのに5分、確認するのに1回の試行でした。


エムティーフォー

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

初心者の方からの質問 MQL5 MT5 MetaTrader 5

fxsaber さん 2019.07.21 12:54

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);
    }
  }


MT5

#include <Trade\Trade.mqh>

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static CTrade Trade; // Не стал возиться с Deviation.
  static ulong ticket1 = 0;
 
  if (!ticket1)
    ticket1 = Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.1, Ask, Ask - 100 * _Point, Ask + 100 * _Point) ? Trade.ResultOrder() : 0;
  else if (!PositionSelectByTicket(ticket1) && HistorySelectByPosition(ticket1))
  {
    ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);
    double open = cmd ? Bid : Ask;
    double tp = open - (cmd ? 1 : -1) * 100 * _Point;
    double sl = open + (cmd ? 1 : -1) * 100 * _Point;
    ticket1 = Trade.PositionOpen(_Symbol, cmd, 0.1, open, sl, tp) ? Trade.ResultOrder() : 0;
  }
}


強い熟練者でなくても、MT5の基本が分かっていれば書けます。


ZS ネットでは、クローズドポジションの種類を決めるのに、ちょっとしたニュアンスがあります。しかし、ここではその役割はない。

 
fxsaber:

強くなくても、MT5の基本が分かっていれば書けます。

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

はい、SBで5行で書けない場合の解決策を探していました。

しかし、1つのSB CTradeが私の問題を解決することができないことをどれだけ理解しましたか? そして、私はCPositionInfoも使用しなければならなかったのですか?- 複数のTFによる9つのポジションを同時に同行させたい場合?

ZS:私はスマートテレビでMQL5ヘルプに座っている - かなりよく貿易関数を 説明し、SatBの使用は、質問の下にある....私はプリミティブ戦略、少し複雑なためにSBを使用することは理にかなっていると思う - 機能が不十分であるか、または明白ではない使用、多分私はより多くの練習が必要 - 私はSBを "ひねり "に挑戦します。


いつもありがとうございます。

 
fxsaber:

理由は無能だからと答えました。書くのに5分、確認に1回の試行が必要でした。


エムティーフォー


MT5


強い熟練者でなくても、MT5の基本が分かっていれば書けます。


基本的なことは知らなくても、MT5の基本的なことが分かっていれば大丈夫です。でも、ここではそんなことは関係ない。

ここで

ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);

は、潜在的な落とし穴があります。

ヒストリカル・リストでは、ワラントはそのリストに表示されている順番に並べられていない。ライブラリの開発中に偶然見つけたものです。 頼りにしていました。しかし、そう簡単にはいかないことがわかった。指値→逆指値→指値→逆指値→指値→逆指値の順で順番に設定し、それぞれを任意の順番で削除して、どの注文が最後に履歴一覧に記録されるか確認してみてください。きっと驚かれることでしょう。

 
Artyom Trishkin:

ここで

は、エラーの可能性があります。

履歴一覧で、注文が表示順に並んでいない。ライブラリの開発時に遭遇しました。 頼りにしていました。しかし、そう簡単にはいかないことがわかった。指値→逆指値→指値→逆指値→指値→逆指値の順で順番に設定し、それぞれを任意の順番で削除して、どの注文が最後に履歴一覧に記録されるか確認してみてください。きっと驚かれることでしょう。

リストはHistorySelectByPositionによって生成されるため、そこにエラーはありません。

理由: