コーディングの方法は? - ページ 151

 
luxinterior:
OrderReliableのインクルードファイルを使ってください。

OrderSendReliable関数に 少し欠けているようですが、新しいバージョンをお持ちですか?

 

計算で時間を使う方法

私はMQL4初心者で、いくつかの基本的な関数を 使った簡単なEAを作れないか試していたところです。私はC++はよく知っていますが、MQL4は苦手です。なぜなら、このコードは何か変で、時間関数かおそらく売買関数に関係していると思います。...ところで、これはお金を稼ぐために設計されたわけではなく、単に関数をテストするためです。

int start()

{

//----

ダブルcurrenttimeN、currentvalue。

double timeM = 時間分(TimeCurrent());

double timeH = TimeHour(TimeCurrent());

currenttimeN = (timeH / 24) + (timeM / 1440);//パーセントまたは1(1 = 1日)として一日の時間を与えるので、常に1より小さい

currentvalue = Ask;

if (現在の値 > 現在のtimeN){。

注文送信(Symbol(),OP_SELL,1,Ask,3,Ask-25*Point, Ask+25*Point, "My order #2",16384,0,Green) { (currentvalue>currenttimeN).の場合。

}

/* 買いコマンド */

else if (現在値 < 現在時刻N){ { { {現在値 < 現在時刻N)

OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point, "My order #2", 16384,0,Green)。

//----

return(0)。

}

 

...................

 

文字列が違う。

currenttimeN = (timeH / 24) + (timeM / 1440);//gives the time of day as a percent or 1 (1 = one complete day) so always less than 1[/CODE]

could be:

[CODE]currenttimeN = (timeH *60 + timeM) / 1440;

曜日と価格を比較する方法は?

 

同時に購入と売却を行う

どなたか、売買を同時に行えるようにプログラムを組むのを手伝っていただけませんか?

よろしくお願いします。

例えば

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green).チケットは、Symbol()に送られます。

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point,"-", 0, 0, Red)です。

}

問題は、買いだけです。しかし、私はそれが両方の順序を実行する必要があります。

 
kk81:
誰か私が同時に売買できるようにプログラムするのを助けてください...いくつかのスクリプトやその他...

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

の例です。

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, Red).このチケットは、Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point に基づいています。

問題は買いだけなのですが、両方の注文を実行する必要があるのです...ありがとうございます。

https://www.mql5.com/en/forum/177583/page37

 

OrderCloseの戻り値を取得する方法は?

注文がどのような価格でクローズされたかを知りたいのですが。

ファイル:
closeorder.jpg  62 kb
 

FXフリーダム バー

こんにちは

すべての友人、特定のRoger09を どうもありがとうございました

私は専門家(自動取引)ForexFreedomBarsをしたい。

5m,15m,30m,1Hが赤の場合、10-20TPで売り注文を出す。

5m,15m,30m,1Hが青の場合、10-20TPで買い注文を出す。

(TP、SL、ロット、maxtrade) 能力を変更する必要があります。

私を助けてください。

//+------------------------------------------------------------------+

//| #フォレックス フリーダムバーズ

//|

//+------------------------------------------------------------------+

#property コピーライト "Programmed by Eli hayun"

#property indicator_separate_window (インジケーター・セパレート・ウィンドウ)

#property indicator_minimum -0.5

//#property indicator_maximum 5

#property indicator_buffers 8 (インジケーターバッファー)

#property indicator_color1 レッド

#property indicator_color2 ドジャーブルー

#property indicator_color3 レッド

#プロパティ indicator_color4 DodgerBlue

#property indicator_color5 レッド

#プロパティ indicator_color6 DodgerBlue

#プロパティ indicator_color7 レッド

#プロパティ indicator_color8 DodgerBlue

//---- バッファ

double buf4_up[];

double buf4_down[];

double buf3_up[];

double buf3_down[];

double buf2_up[];

double buf2_down[];

double buf1_up[];

double buf1_down[];

extern double Gap = 1; // バーの行間の隙間

extern int Period_1 = PERIOD_M5;//M15

extern int Period_2 = PERIOD_M15;//M30

extern int Period_3 = PERIOD_M30;//H1

extern int Period_4 = PERIOD_H1;//H4

extern int cci_1 = 2;//50

EXTERN INT CCI_2 = 2;//14

EXTERN INT CCI_3 = 2;//14

extern int cci_4 = 2;

extern int StopLoss=100;

extern int TakeProfit=100;

extern double Lots=0.1;

extern bool AutoDisplay = false;

文字列ショートネーム = "";

bool firstTime = true;

int UniqueNum = 228;

//+------------------------------------------------------------------+

//| カスタムインジケータ 初期化関数

//+------------------------------------------------------------------+

int init()

{

SetAutoDisplay()を設定します。

shortname = "# Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")";

firstTime = true。

IndicatorShortName(ショートネーム);

//---- インジケータ

SetIndexStyle(0,DRAW_ARROW)を設定します。

SetIndexArrow(0,110)を設定します。

SetIndexBuffer(0,buf4_up)を設定します。

SetIndexEmptyValue(0,0.0);

SetIndexStyle(1,DRAW_ARROW)を設定します。

SetIndexArrow(1,110)を設定します。

SetIndexBuffer(1,buf4_down)を設定します。

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW)を設定します。

SetIndexArrow(2,110);

SetIndexBuffer(2,buf3_up)を設定します。

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW)を設定します。

SetIndexArrow(3,110);

SetIndexBuffer(3,buf3_down)を設定します。

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW)を設定します。

SetIndexArrow(4,110);

SetIndexBuffer(4,buf2_up)を設定します。

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW)を設定します。

SetIndexArrow(5,110)を設定します。

SetIndexBuffer(5,buf2_down)を設定します。

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW)を設定します。

SetIndexArrow(6,110)を設定します。

SetIndexBuffer(6,buf1_up)を設定します。

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW)を設定します。

SetIndexArrow(7,110)を設定します。

SetIndexBuffer(7,buf1_down)を設定します。

SetIndexEmptyValue(7,0.0);

//----

return(0);

}

//+------------------------------------------------------------------+

//| カスタムインジケータ初期化関数

//+------------------------------------------------------------------+

int deinit()

{

//----

SetAutoDisplay()を設定します。

shortname = "# Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")";

firstTime = trueです。

//----

return(0);

}

//+------------------------------------------------------------------+

//| カスタムインジケーターイテレーション関数

//+------------------------------------------------------------------+

int start()

{

int counted_bars=IndicatorCounted();

int i=0, y5m=0, y1h=0, y30m=0, y15m=0, yy;

int limit=Bars-counted_bars;

datetime TimeArray_1H[], TimeArray_30M[], TimeArray_15M[], TimeArray_5M[];

//----

if (firstTime || NewBar())

{

firstTime = false;

int win = UniqueNum; // WindowFind(ショートネーム);

double dif = Time[0] - Time[1];

for (int ii=ObjectsTotal()-1; ii>-1; ii--)

{

if (StringFind(ObjectName(ii),「FF_」+win+「_」) >= 0)

ObjectDelete(ObjectName(ii))を実行します。

さもなくば

ii=-1;

}

double shift = 0.2;

for (ii=0; ii<4; ii++)

{

文字列 txt = "?";

double gp;

switch (ii)

{

case 0: txt = tf2txt(Period_1);gp=1+シフト;break。

case 1: txt = tf2txt(Period_2); gp = 1 + Gap + shift; break;

case 2: txt = tf2txt(Period_3); gp = 1 + Gap*2 + shift; break;

case 3: txt = tf2txt(Period_4); gp = 1 + Gap*3 + shift; break;

文字列名 = "FF_"+win+"_"+ii+"_"+txt;

ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);

ObjectSetText(name, txt,8, "Arial", Silver);

}

}

ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_4);

ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3); } ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3);

ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_2); ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_3);

ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1); ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1);

for(i=0, y5m=0, y1h=0, y30m=0, y15m=0;i<limit;i++)

{

if (Time<TimeArray_5M[y5m]) y5m++;

if (Time<TimeArray_1H[y1h]) y1h++;

if (Time<TimeArray_30M[y30m])・・・y30m++。

if (Time<TimeArray_15M[y15m]) y15m++;

int cci_n = cci_1;

for (int tf = 0; tf < 4; tf++)

{

int prd;

switch (tf)

{

case 0: prd = Period_1; cci_n = cci_1; yy = y5m; break;

case 1: prd = Period_2; cci_n = cci_2; yy = y15m; break;

case 2: prd = Period_3; cci_n = cci_3; yy = y30m; break;

case 3: prd = Period_4; cci_n = cci_4; yy = y1h; break;

}

double cci = iCCI(NULL, prd, cci_n,PRICE_TYPICAL, yy);

double dUp = EMPTY_VALUE; // iCustom(NULL, prd, "SuperTrend", false, 1, yy);

double dDn = EMPTY_VALUE; //iCustom(NULL, prd, "SuperTrend", false, 0, yy);

if (cci < 0) dUp = 1; else dDn = 1;

スイッチ (tf)

{

case 0: if (dUp == EMPTY_VALUE) buf1_down = 1; else buf1_up = 1; break;

case 1: if (dUp == EMPTY_VALUE) buf2_down = 1 + Gap * 1; else buf2_up = 1 + Gap * 1; break;

case 2: if (dUp == EMPTY_VALUE) buf3_down = 1 + Gap * 2; else buf3_up = 1 + Gap * 2; break;

case 3: if (dUp == EMPTY_VALUE) buf4_down = 1 + Gap * 3; else buf4_up = 1 + Gap * 3; break; break;

}

if (NewBar())

{

string sDir = "";

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

sDir = "上";

if (buf1_down[0] + buf2_down[0] + buf3_down[0] + buf4_down[0] == 4)

sDir = "下";

if (sDir != "")

{

PlaySound("alert1.wav")。

Print("Forex freeway - Direction ",sDir);

}

}

}

}

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss ,TakeProfit); else

return(0);

}

//+------------------------------------------------------------------+

文字列 tf2txt(int tf)

{

if (tf == PERIOD_M1) return("M1")。

if (tf == PERIOD_M5) return("M5")。

if (tf == PERIOD_M15) return("M15")。

if (tf == PERIOD_M30) return("M30")。

if (tf == PERIOD_H1) return("H1")。

if (tf == PERIOD_H4) return("H4")。

if (tf == PERIOD_D1) return("D1")。

if (tf == PERIOD_W1) return("W1")。

if (tf == PERIOD_MN1) return("MN1")。

return("??");

}

void SetValues(int p1, int p2, int p3, int p4)

{

周期_1 = p1; 周期_2 = p2; 周期_3 = p3; 周期_4 = p4;

}

void SetAutoDisplay()

{

if (AutoDisplay)

{

switch (周期())

{

case PERIOD_M1 : SetValues(PERIOD_M1, PERIOD_M5, PERIOD_M15,PERIOD_M30); break;

case PERIOD_M5 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); break;

case PERIOD_M15 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); break;

case PERIOD_M30 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30, PERIOD_H1); break;

case PERIOD_H1 : SetValues(PERIOD_M15, PERIOD_M30,PERIOD_H1, PERIOD_H4) ; break;

case PERIOD_H4 : SetValues(PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1) ; break;

case PERIOD_D1 : SetValues(PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1); break;

case PERIOD_W1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;

case PERIOD_MN1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break; break;

}

}

}

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Time[0];

return(true)とする。

}

return(false);

}

 

インディケータをフィルタ関数としてEAに移行する際の問題点

インジケーターの一部を関数としてEAで使おうとしたところ、関数には3つのタイプがあることに気づきました。1つ目は、処理を行い0を返すVoid、2つ目は、計算を行い1つの結果を返すもの。3つ目のタイプは、特定の値のセットが与えられることを想定して処理し、1つの結果を返すものです。

もし、私の計算が3つの結果を出し、少なくとも2つの異なる方法で使用する必要がある場合、どうしたらよいでしょうか?外部変数(手動で調整可能)とグローバル変数(リコンパイルしない限り静的)から、EA のさまざまな関数に情報が流れます。Start() 関数は EA の頭脳であり、情報を得るために他の関数に連絡を取ります。もし関数が () の中で変数を宣言していれば、その関数の引数として一連の変数を渡すことができます。そして、結果を受け取り、さらに別の関数に変数を渡して処理を終了することができる。

他の関数に引数として変数を渡すことができるようになると、EAコーディングで成功を収められると期待していました。残念ながら、ゼロディバイトエラーが出て しまいました。そのため、ゼロディバイトエラーが発生しました。次の改訂では、中間ステップを削除し、値を使用する関数に直接渡すようにしました。

(私はMQL4のコーディングを学んで最初の2ヶ月の経験で、この点を記録することは自分のためにならないと思っています。しかし、"MQL4 ゼロ除算エラー "でググっている人は、私がどのように解決したかを知れば喜ぶかもしれません)。

次のEAの修正でゼロ除算エラーは治りましたが、私のストラタジーテスターのジャーナルコメントにはスタックオーバーランと表示されるようになりました。MQL4 スタックオーバーラン」でググってみて、私が見つけた原因を載せておきます。それは、注文を開始または変更するために価格を変更する際に、定数「ポイント」を使用してロットを10進数に変換することに失敗したことです。

最後に、2ヶ月のコーディング経験と12回以上のEA書き換えの結果、見つけにくかった「左括弧の不等号」を解決する方法を掲載します。MetaEditorは、括弧のテキストを色でハイライトしません。AutoDesk製品にVisual LISP Editorがあれば、そのエディタでMQ4ファイルを開くと、ほとんどすべてのブラケットのペアをカラーで見ることができます。これにより、括弧の欠落がないかどうか校正するのが非常に簡単になります。

このフォーラムで回答をシェアしてくださる皆さんに感謝します。

Happy Coding!

 

何かお手伝いできることはありますか?

また、メタトレーダーの注文はコマンドラインから実行することができるのかどうか知りたいです。また、一般的に、ある種のAPIを使用してメタトレーダーと外部アプリケーションをインターフェースすることが可能かどうかを知りたいです。

ありがとうございます。

ジェフ