mql5言語の特徴、微妙なニュアンスとテクニック - ページ 18

 
デニス・キリチェンコ
なぜ静電 容量なのか、お聞かせください。

文脈から切り離されているため、元の記事を 参照してください。
 

OnInit()関数の 文書化されていない機能で、この関数はプログラムのどの部分でも実行することができます。テストコード

//+------------------------------------------------------------------+
//|                                                       test10.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private:
   datetime          curbar;
   datetime          lastbar;
public:
                     CNevBar();
                    ~CNevBar();
   bool              bar(string symbol,ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar(void)
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }

int test=0;
CNevBar newbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   test=5;
   Print(__FUNCTION__,": test = ",test);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(newbar.bar(_Symbol,PERIOD_CURRENT))
     {
      test=10;
      Print(__FUNCTION__,": test = ",test);
      OnInit();
     }
  }
//+------------------------------------------------------------------+

結果

2017.03.10 19:26:02.977 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:27:03.041 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:27:03.042 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:28:03.245 test10 (EURUSD,M1)      OnInit: test = 5
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnTick: test = 10
2017.03.10 19:29:02.995 test10 (EURUSD,M1)      OnInit: test = 5


...

 
セルゲイ・グリツァイ

OnInit()関数の 文書化されていない機能で、この関数はプログラムのどの部分でも実行することができます。テストコード


On関数はすべて通常の関数なので、好きなときに呼び出すことができます。OnCalculate または OnTradeTransaction。
 
fxsaber

On関数はすべて通常の関数であり、したがって、好きなときに呼び出すことができる。OnCalculate または OnTradeTransaction のいずれか。


しかし、ドキュメントに書かれているわけではありません

オンイット

OnInit()関数は、OnInitイベントハンドラです。型はvoidまたはintで、パラメータは ありません。

voidOnInit()。

InitイベントはExpert Advisorやインジケータをロードした直後に生成され、このイベントはスクリプトには生成されません。OnInit()関数は、初期化に使用される。OnInit()の戻り値が int の場合、0 以外は初期化に失敗したことを意味し、初期化解除理由コード REASON_INITFAILED で Deinit イベントを発生さ せる。

エキスパートの入力パラメータを最適化するために、ENUM_INIT_RETCODE列挙の値をリターンコードとして使用することが推奨されます。これらの値は、最適な検査 薬の選択など、最適化の過程をコントロールするために使用される。テスト開始前のExpert Advisorの初期化中に、TerminalInfoInteger() 関数を使用して、エージェントの構成とリソースに関する情報(コア数、空きメモリ量など)を要求することができます。得られた情報に基づいて、このテストエージェントの使用を許可するか、このExpert Advisorの最適化の際に使用を拒否することができます。

enum_init_retcode

識別子

商品説明

INIT_SUCCEEDED

初期化が成功すると、Expert Advisor のテストを続行できます。

このコードはゼロと同じ意味です - テスターのExpert Advisorの初期化が成功したことを意味します。

INIT_FAILED

初期化に失敗し、回復不能なエラーのためテストは無意味です。例えば、Expert Advisorの動作に必要なインジケータの作成に失敗した場合。

この値が返された場合、0以外の値が返された場合と同様に、テスター内のExpert Advisorの初期化に失敗していることを意味します。

init_parameters_incorrect

このリターンコードを含む結果文字列は、一般的な最適化テーブルで赤色でハイライトされるように設計されています。

Expert Advisorのこのパラメータのセットに対するテストは実行されず、エージェントは新しいタスクを受け取るために自由になります。

この値を受け取ると、ストラテジーテスターは、このジョブを他のエージェントに渡して繰り返し実行させないことが保証されます。

init_agent_not_suitable

初期化中のエラーはありませんが、何らかの理由で指定されたエージェントはテストに適していません。例えば、RAMの不足、OpenCLの サポートなどです。

このコードが返された後、エージェントはこの最適化が 終了するまでタスクを受け取りません。

void 型の OnInit()関数は、常に初期化の成功を意味する。

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
週末にコードを書くときは、OnInitの中にOnTickを挿入しています。そして、新しいダニが入ってこなくても、すべて順調です
 
セルゲイ・グリツァイ


しかし、ドキュメントに書かれているわけではありません

オンイット

OnInit()関数は、OnInitイベントハンドラです。型はvoidまたはintで、パラメータは ありません。

voidOnInit()。

InitイベントはExpert AdvisorまたはIndicatorをロードした直後に生成されます。

機能であると書いてあります。

OnInitの前とOnDeinitの後に、グローバルオブジェクトのコンストラクタ/デストラクタの呼び出しがある(ヘルプに不正確な記述があります)。そのため、例えばインジケータでは、OnInitを使わずにインジケータ・バッファを宣言することができます。初歩の初歩は以下の通りです。

 
FullOnCalculateを検索 すると、MT4/MT5でインジケータ・バッファを使用する際の完全に文書化されていない多くの機能にすぐにたどり着きます。
 
これが、私が最終的に描いた問題解決のイメージです。
iCustom(... inputs, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );

iAlligator(... params, PRICE_CLOSE,
         color &colors[], int &widths[], int &styles[] );
例えば、あるインジケータがこのようなパラメータを持っているとします。
#property indicator_plots 5
#property  indicator_color1 clrAquamarine, clrBeige, clrBurlyWood
#property  indicator_color2 clrRed, clrGreen

#property  indicator_color5 clrGold, clrCrimson, clrCadetBlue
とすると、その色配列は次のようになります。
color colors[] = {
   clrAquamarine, clrBeige, clrBurlyWood,  // 1 plot
   clrRed, clrGreen,                       // 2 plot
   clrBlack,                               // 3 plot
   clrWhite,                               // 4 plot
   clrGold, clrCrimson, clrCadetBlue,      // 5 plot
   clrBurlyWood, clrBlue                   // ignore
};

配列が小さい場合は、一部の色しか転送されません。配列が大きくなると切り捨てられる。

width 配列と style 配列の場合も原理は同じである。

 
fxsaber

OrderSendSyncでは、オーバーロードされた(上記参照)HistoryDealSelectが呼び出される。

最後のポジションをオープンした時刻と、最後のポジションをクローズした時刻は、どのように判断すればよいのでしょうか?

また、一般的に、mql5のオープン/クローズドポジションの情報を得るための一般的な原理やアルゴリズムが知りたいです。

何を考慮する必要があるのか、現時点ではどのような仕様になっているのか。

 
アルチョム・トリシキン

最後のポジションをオープンした時刻と、最後のポジションをクローズした時刻は、どのように判断すればよいのでしょうか?

一般的に、mql5でオープン/クローズドポジションの情報を得るための一般的な原理とアルゴリズムを知りたいです。

何を考慮すべきなのか、現時点での特殊性は?


これはすべて、注文と取引履歴を選択し、注文のプロパティを読み取ることで決定されます。

bool  HistorySelectByPosition( 
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

position_identifier

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

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

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


そして、列挙型ENUM_DEAL_ENTRY からプロパティを使用する。

DEAL_ENTRY_IN

市場への参入

DEAL_ENTRY_OUT

市場の出口

取引参加者

ユーターン

取引参加者

カウンターポジションを閉じる

理由: