1

[ カスタム インジケーター ]に使用しようとしていますChartSetSymbolPeriod()が、このインジケーターを別の [ エキスパート アドバイザー ] で使用しようとすると、MT4 プラットフォームが遅くなります。

特に[Expert Advisors ] の [注文、板情報] タイプ。

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

string    ChangeSP = "Where I go?";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//---
    ObjectCreate     ( 0, ChangeSP, OBJ_BUTTON,           0, 0, 0            );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_XDISTANCE,    15                 );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_YDISTANCE,    100                );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_XSIZE,        200                );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_YSIZE,        40                 );
    ObjectSetString  ( 0, ChangeSP, OBJPROP_TEXT,         "Go to GBPUSD M15" );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_COLOR,        White              );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_BGCOLOR,      Red                );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_BORDER_COLOR, Red                );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_BORDER_TYPE,  BORDER_FLAT        );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_BACK,         false              );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_HIDDEN,       true               );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_STATE,        false              );
    ObjectSetInteger ( 0, ChangeSP, OBJPROP_FONTSIZE,     12                 );
//---
    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start(){
    return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit(){
    return(0);
}
//+------------------------------------------------------------------+
void OnChartEvent( const int     id,
                   const long   &lparam,
                   const double &dparam,
                   const string &sparam
                   ) {
    if (  sparam == ChangeSP ) {
       ChangeSPClick( ChangeSP );
       ObjectSetInteger( 0, ChangeSP, OBJPROP_STATE, false );
    }
}
//+------------------------------------------------------------------+
void ChangeSPClick( bool   ChartSetSymbolPeriod ) {
    bool ChangeSP_action = ChartSetSymbolPeriod( 0, "GBPUSD", 15 );
}
4

1 に答える 1

1

パフォーマンス?
最初: すべての [カスタム インジケーター] 1 つの単一のスレッドを共有します。

この新しいアーキテクチャ機能により、[ カスタム インジケータ ]のMQL4.56789ノンブロッキングでパフォーマンス重視のコードに十分な注意を払う必要性がさらに高まります。

次に、MQL4 ドキュメントでは、への呼び出しChartSetSymbolPeriod()は同期的ではなく、TaskQueue にもう 1 つのチケットを追加するだけであると述べています。

ChartSetSymbolPeriod()

指定されたチャートの銘柄と期間を変更します。関数は非同期です。つまり、コマンドを送信し、実行の完了を待ちません。コマンドはチャート メッセージ キューに追加され、前のすべてのコマンドが処理された後でのみ実行されます。

他に何が既にキューに入っているでしょうか?
MQL4 は、次のタイプの<ChartEVENT>-s を認識します:

OnChartEvent()ChartEvent イベントのグループのハンドラーです。

·CHARTEVENT_KEYDOWN — チャート ウィンドウがフォーカスされているときのキーストロークのイベント。

·CHARTEVENT_MOUSE_MOVE — マウス移動イベントとマウス クリック イベント (CHART_EVENT_MOUSE_MOVE = trueがチャートに設定されている場合);

·CHARTEVENT_OBJECT_CREATE
— グラフィック オブジェクト作成のイベント (CHART_EVENT_OBJECT_CREATE = trueがチャートに設定されている場合);

·CHARTEVENT_OBJECT_CHANGE
— プロパティ ダイアログによるオブジェクト プロパティの変更イベント。

·CHARTEVENT_OBJECT_DELETE
— グラフィック オブジェクトの削除のイベント (CHART_EVENT_OBJECT_DELETE = trueがチャートに設定されている場合);

·CHARTEVENT_OBJECT_CLICK
— チャートに属するグラフィカル オブジェクトでのマウス クリックのイベント。

·CHARTEVENT_OBJECT_DRAG
— マウスを使用したグラフィカル オブジェクトの移動のイベント。

·CHARTEVENT_OBJECT_ENDEDIT
— LabelEdit グラフィカル オブジェクトの入力ボックスでテキスト編集が終了したイベント。

·CHARTEVENT_CLICK
— チャート上でのマウス クリックのイベント。

·CHARTEVENT_CHART_CHANGE
— チャート変更のイベント; · — ユーザー イベントの ID。n は 0 から 65535 の範囲です。· — カスタム イベントの最後の許容 ID 。<<<<<<<<<<<<<<<<<<<<

CHARTEVENT_CUSTOM + n


CHARTEVENT_CUSTOM_LAST
== ( CHARTEVENT_CUSTOM +65535 )

シンボル期間の変更は主要なチャートの取り組みです。[MetaTrader Terminal 4] は、チャート内に描かれている商品の現在の状態をすべて破棄し、次にバック オブ ザ ハウスに移動して、すべての履歴を取得します。からレコードを保存し[HistoryCentre](F2その機能が動作していることを確認してください)、それに応じて GUI を再描画する必要があります。

そして、
1)時間
がかかります 2)<ChartEVENT>これもまたトリガーとなるOnChartEvent()ハンドラーを作成します。
3)「第一広場」に戻る

ループ内で無限に実行する必要があるために、マウストラップホイールの配置が作成されますか?
はい、そうです。


また、すでに副作用に気づいているかもしれません

関数呼び出しシグネチャの名前は MQL4 関数の名前をマスクします

//+------------------------------------------------------------------+
    void ChangeSPClick( bool   ChartSetSymbolPeriod ) {
        bool ChangeSP_action = ChartSetSymbolPeriod( 0, "GBPUSD", 15 );
    }
于 2016-10-29T15:15:48.947 に答える