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

 
Alexey Kozitsyn:
そして、チェックすべきはポジションでもディールでもなく、オーダーです。なぜなら、オーダーが先で、次にディール、そしてポジションとなるからです。

なぜ注文だけなのか?案件にはポジションID(チケット)はないのですか?

 
Alexey Viktorov:

なぜ注文だけなのか?案件にはポジションID(チケット)はないのですか?

はい、おっしゃるとおりです。オーダーとディールの両方がポジション識別子を持つ。しかし、一般的なケースでは、ポジションには、取引を開始した最初のオーダーの識別子が割り当てられることを知っておく必要があります。したがって、ポジションを開始する「主体」は注文者であり、取引者ではない。そして、検索すべきは案件ではなく、受注である。

ドキュメントより

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

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

 
Alexey Kozitsyn:

はい、おっしゃるとおりです。注文と取引の両方がポジション識別子を持ちます。しかし、一般的には、ポジションには取引を開始した最初の注文の識別子が割り当てられることを 知っておく必要があります。したがって、ポジションを開始する「主体」は注文者であり、取引者ではない。そして、検索すべきは案件ではなく、受注である。

ドキュメントより

反論するつもりはない、ドキュメントに書いてある通りだ。しかし、同じ文書の他の箇所には「原則として...」と書かれており、矛盾がある可能性があります。そして、これは私がかつて遭遇した「原則通り」なのだが......。

位置

ポジションチケットのことです。ポジションの変更およびクローズ 時に、そのユニークな識別のために記入される必要があります。原則として、ポジションを建てた注文のチケットに対応します。

覚えていないし、理解し、読み、訂正し、忘れたとは考えにくい。読んで、訂正して、忘れてしまった。
 
Vitaly Muzichenko:
取引に使用したチケットを回収する方法を教えてください。スクリーンショットでは "63214735 "となっています。

ここでは、Dealのリストの中の位置番号を探しているのですが、そうでない場合は間違って います。

以下は、HistorySelectByPositionが 与える効果を示すスクリプト です。

//--- input parameters
input int      Position;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ ulong Ticket;
  if ( HistorySelectByPosition(Position) )
  { Print("Position = "+IntegerToString(Position));
    int o=HistoryOrdersTotal()-1;
    while ( o>=0 )
    { Ticket=HistoryOrderGetTicket(o);
      Print("Order "+IntegerToString(o)+" = "+IntegerToString(Ticket));
      o--;
    }
    int d=HistoryDealsTotal()-1;
    while ( d>=0 )
    { Ticket=HistoryDealGetTicket(d);
      Print("Deal "+IntegerToString(d)+" = "+IntegerToString(Ticket));
      d--;
    }
  }
}

そして、その結果はこのようになります。

Position = 65328142
Order 1 = 65347809
Order 0 = 65328142
Deal 1 = 4070777
Deal 0 = 4051254

0 = オープンポジション

1 = クローズポジション

出ない場合=チケットポジションを入力しなかった場合

Deal Ticketから始めても同じ結果が得られます。

HistoryDealGetInteger()関数の場合

enum_deal_property_integer

識別子

商品説明

タイプ

DEAL_TICKET(ディールチケット

お得なチケット各取引に付与される固有番号

DEAL_ORDER

売買が成立した注文書

DEAL_TIME(ディールタイム

取引実行時間

時分

DEAL_TIME_MSC

1970年01月01日からのディール実行時間(ミリ秒)。

DEAL_TYPE

案件の種類

ENUM_DEAL_TYPE

DEAL_ENTRY

ディール方向 - 市場参入、市場撤退または反転

enum_deal_entry

DEAL_MAGIC

案件のマジックナンバー( ORDER_MAGIC参照)

DEAL_REASON

取引の理由または発生源

enum_deal_reason

deal_position_id

この取引が関与した、開始、変更、または終了のポジションの識別子。 各ポジションには一意の識別子があり、その識別子はポジションの有効期間中にその商品で行われたすべての取引に割り当てられます。

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ivan Ivanov:

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

これが必要だった:HistoryOrderGetTicket

 
Vitaly Muzichenko:

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

これが必要だった:HistoryOrderGetTicket

注文は1.0ロットまで可能です。しかし、例えばロット0.9など部分的に実行されることもあり、その場合は残りが拒否されます(実行モードに依存)。そして、注文のロットを検索し始めると、矛盾が生じます。

 

OHLC環境値を取得するための適切なコードが必要です。

オプション1

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
//   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   int copied=CopyClose(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyClose(symbol,timeframe,0,Bars(symbol,timeframe),CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }


オプション2

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }
 
Aleksey Vyazmikin:

OHLC環境値を取得するための適切なコードが必要です。

オプション1


オプション2

どのように適用したかを示すコードのスニペットを投稿してください。
 
Vitaly Muzichenko:
どのように適用したのか、コードの一部を掲載する

どの作品が遅くなっているのかわからない。ループを含め、いろいろな方法で適用しているのだが......。


以下はその一例です。


            for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               if((Low(X)>PricePeresek && High(X)>PricePeresek) || 
                  (Low(X)<PricePeresek && High(X)<PricePeresek))
                  calcBarPeresek++;
               else break;
              }
 
Aleksey Vyazmikin:

どの作品が遅くなっているのかわからない。ループを含め、いろいろな方法で適用しているのだが......。

ループではそう思えるし、関数がなくても大丈夫です

            double LOW[1],HIGH[1];
             for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               CopyLow(Symbol(),PERIOD_CURRENT,X,1,LOW);
               CopyHigh(Symbol(),PERIOD_CURRENT,X,1,HIGH);
               if((LOW[0]>PricePeresek && HIGH[0]>PricePeresek) || 
                  (LOW[0]<PricePeresek && HIGH[0]<PricePeresek))
                  calcBarPeresek++;
               else break;
              }
理由: