スポンサーリンク
検索
カスタム検索
リファレンスツリー
オススメ
RefreshRates


RefreshRates


事前定義された変数と時系列配列のデータを更新します。


関数書式:
bool  RefreshRates();



■引数

無し



■戻り値
データが更新された場合はtrueを返します




■備考
EAが長時間計算をしてデータの更新を必要としている時にこの関数を使用します。
データが更新された場合はtrueを返します。
クライアントターミナルの現在のデータと等しい場合はfalseを返します。

EAとスクリプトは、ヒストリーデータのコピーを独自に持ちます。
現在の通貨ペアのデータはEAやスクリプト起動時にコピーされます。

EAはサブシーケンス起動毎にデータ更新します(スクリプトは1度だけ実行されtick受信に依存しません)。
EAの処理中に1つ以上の新しいtick受信すると、データが古くなります。

サンプルソース:
実際に新規注文を行うのでサンプルソースの実行はデモ口座で行って下さい。
#property strict

#include <stderror.mqh>
#include <stdlib.mqh>

static bool EntryBool = false;


void OnTick(void) {

    int order_resend_num;        // エントリー試行回数
    int close_resend_num;        // クローズ試行回数
    int ea_ticket_res;           // チケットNo
    int errorcode;               // エラーコード
    double ea_order_entry_price; // エントリーレート
    double ea_order_close_price; // 決済レート
    bool closeret;               // 決済判定
    bool selbool;                // チケット選択判定
    double closelot;             // 決済lot

    if ( EntryBool == false ) {
        EntryBool = true;
    } else {
        return;
    }


    if ( IsDemo() == false ) {
        MessageBox("実際に新規オーダーするので、デモ口座で動作させて下さい。","エラー",MB_ICONEXCLAMATION);
        return;                // 処理終了
    }

    ea_order_entry_price = Ask; // 現在の買値でエントリー

    for( order_resend_num = 0; order_resend_num < 10; order_resend_num++ ) {    // エントリー試行回数上限:10回
    
        if ( IsDemo() == true ) {
            ea_ticket_res = OrderSend(   // 新規エントリー注文
                Symbol(),                // 通貨ペア
                OP_BUY,                  // オーダータイプ[OP_BUY / OP_SELL]
                0.01,                     // ロット[0.01単位]
                ea_order_entry_price,     // オーダープライスレート
                20,                       // スリップ上限    (int)[分解能 0.1pips]
                0,                        // ストップレート
                0,                        // リミットレート
                "テストオーダー",         // オーダーコメント
                999,                      // マジックナンバー(管理用)
                0,                        // オーダーリミット時間
                clrRed                   // オーダーアイコンカラー
                );
        }
        
        if ( ea_ticket_res == -1) {            // オーダーエラー
            errorcode = GetLastError();      // エラーコード取得

            if( errorcode != ERR_NO_ERROR) { // エラー発生
                printf("エラーコード:%d , 詳細:%s ",errorcode , ErrorDescription(errorcode));

                if ( errorcode == ERR_TRADE_NOT_ALLOWED ) { // 自動売買が許可されていない
                        MessageBox(ErrorDescription(errorcode),"オーダーエラー",MB_ICONEXCLAMATION);
                    return;
                }
            }

            Sleep(1000);                                           // 1000msec待ち
            RefreshRates();                                       // レート更新
            ea_order_entry_price = Ask;                            // 更新した買値でエントリーレートを再設定
            printf("再エントリー要求回数:%d, 更新エントリーレート:%g",order_resend_num+1 ,ea_order_entry_price);

        } else {    // オーダー約定
            Print("新規オーダー約定。 チケットNo=",ea_ticket_res);
            Sleep(1000);                                           // 1000msec待ち(オーダー要求頻度が多過ぎるとエラーになる為)
            

            ea_order_close_price = Bid;                            // 現在の売り値で決済
            selbool = OrderSelect(ea_ticket_res,SELECT_BY_TICKET); // オーダー中のチケット選択(チケットNo指定)

            if ( selbool == true) {                                // チケット選択出来ている場合
                closelot = OrderLots();                           // 選択したチケットのオーダーlotを取得
            } else {
                closelot = 0.01;
            }
            
            for( close_resend_num = 0; close_resend_num < 20; close_resend_num++ ) { // 決済試行回数上限:20
                closeret = OrderClose(                    // 決済注文
                        ea_ticket_res,                     // チケットNo
                        closelot,                          // 決済lot
                        ea_order_close_price,              // 決済レート
                        20,                                // スリップ上限    (int)[分解能 0.1pips]
                        clrBlue                           // オーダーアイコンカラー
                    );
                
                if ( closeret == false ) {                 // 決済注文拒否
                    Sleep(1000);                          // 1000msec待ち
                    RefreshRates();                      // レート更新
                    ea_order_close_price = Bid;           // 更新した売値で決済レートを再設定
                    printf("再決済要求回数:%d, 更新決済レート:%g",close_resend_num+1 ,ea_order_close_price);

                } else {                                   // 決済注文約定
                    Print("決済オーダー約定。 チケットNo=",ea_ticket_res);
                    break;
                }
            }
            break;
        }
    }
} 

実際に新規注文を行うのでサンプルソースの実行はデモ口座で行って下さい。

結果:
open #15164459 buy 0.01 EURGBP at 0.72617 ok
新規オーダー約定。 チケットNo=15164459
再決済要求回数:1, 更新決済レート:0.72614
close #15164459 buy 0.01 EURGBP at 0.72617 at price 0.72614
決済オーダー約定。 チケットNo=15164459

値動きが激しい時に行うとリフレッシュ処理が必要になります。




管理人の勝手なコメント:
指標発表時や要人発言で値動きが激しい時に重宝します。


スポンサーリンク



Copyright ©2015 MT4でEA自作しちゃお〜 All Rights Reserved.


Top

inserted by FC2 system