コーディングのヘルプ - ページ 39

 

私はこのような行を書きました。

int TriggerChart = PERIOD_H4;

int FastMACDPeriod = 12;

int SlowMACDPeriod = 26 ;

int SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1).このような変数を挿入することで、このような現象が発生することはないでしょうか。

これらの変数を挿入することで、EAはTriggerChartが'int timeframe'であり、他の変数はint periodに使用されていることを識別することができるのだろうかと思います。TriggerChartとFastMACDPeriodを一緒に見て、両方ともint timeframeに関係していると思い、混乱するのでしょうか?EAはどの時点で、どの変数がiMACDのどの部分に適用されるかを認識するのでしょうか?

 

...

要するに、混乱することはないのです。(コンピュータは考えるのではなく、解釈することなく同じことを何度も何度も実行します)コーダーだけが時々混乱するのです。

関数を 呼び出すとき、ある順序(場所)でパラメータを受け取る(例えば:最初のパラメータはシンボル、2番目は時間枠、、、)関数を呼び出すときに変数をどう宣言(タイプ)するかは全く関係ない:それらはパラメータ呼び出しリストでの場所によって厳密に使用されるのである

crsnape@btinternet.com:
このような行を書きました。

int TriggerChart = PERIOD_H4;

int FastMACDPeriod = 12;

int SlowMACDPeriod = 26 ;

int SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1)です。

これらの変数を挿入した場合、EAはTriggerChartが'int timeframe'で、その他はint periodsに使われていることを識別できているのでしょうか?例えば、TriggerChartとFastMACDPeriodを一緒に見て、両方ともint timeframeに関係していると思い、混乱してしまうということはないでしょうか?EAはどの時点で、どの変数がiMACDのどの部分に適用されるかを認識するのでしょうか?
 

mladenさん、ありがとうございます。論理的ですね。

このコードでは、int init()関数で BarsGVを0と宣言しています。しかし、あなたが言うように、エラーが発生した場合、それはまだfalseを返します。ただ、int init()で0と宣言する代わりに、それを1にリセットすることができると考えています。どうでしょうか?私は200SMAを持っていて、もしBarsが200より小さいなら、とにかくここでエラーを拾います。

だから、この代わりに

int init()

{

//---

GlobalVariableSet (BarsGV, 0);

//---

return(0);

}

これはint start()の下にあります。

if ((GlobalVariableGet (BarsGV) == 0)|| (GlobalVariableGet (BarsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV, false)。

GlobalVariableSet(BarsGV, Bars);

}

//--- ロングポジション(買い)の可能性をチェック

if (GlobalVariableGet (HasOrderedGV) == false)

{

これに変更する。

int init()

{

//---

GlobalVariableSet (BarsGV, 1);

//---

return(0);

}

これはint start()の下にあります。

if (GlobalVariableGet (BarsGV) == 0);

{

Print("Error with Global Variable BarsGV", GetLastError());

return(0);

}

if (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarsGV, Bars);

//--- ロングポジション(買い)の可能性をチェック

if (GlobalVariableGet (HasOrderedGV) == false)

{

どうでしょうか?

 

...

このように変更してください。

int BarsGV;

bool HasOrderedGV;

int init()

{

//---

BarsGV=0;

HasOrderedGV=false;

//---

return(0);

}

THIS IS UNDER INT START()

if (BarsGV < Bars)

{

HasOrderedGV=false;

BarsGV=Bars;

}

//--- Check for long position (BUY) possibility

if (HasOrderedGV == false)

{[/PHP]

That way you are going to avoid other EA interference and you will keep the variables to only one instance of Ea (they can not mix at all). Much better to do it that way (even from the speed of execution point of view). But you still risk of opening a new order on a same bar this way. The best way is to use a function to count orders opened at the current bar and then allow or disallow ner order opening

Here is a function that can do that (it will check currently opened as well as already closed orders if they have been opened on a current bar) :

bool uniqueOnBar(int MagicNumber)

{

datetime startTime = Time[0];

datetime endTime = startTime+60*Period();

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

for (i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}

Checking would be very simple :

[PHP]if (uniqueOnBar(MagicNumber)) .... you can open an a new order

この方法では、変数に依存せず、注文にのみ依存することになります。

crsnape@btinternet.com:
mladenさん、ありがとうございます。論理的な感じですね。

このコードでは、int init()関数でBarsGVを0と宣言しています。しかし、あなたが言うように、エラーが発生した場合、それはまだfalseを返します。ただ、int init()で0と宣言する代わりに、それを1にリセットすることができるのではないかと考えています。どうでしょうか?私は200SMAを持っていて、もしBarsが200より小さいなら、とにかくここでエラーを拾います。

だから、この代わりに

int init()

{

//---

GlobalVariableSet (BarsGV, 0);

//---

return(0);

}

これはint start()の下にあります。

if ((GlobalVariableGet (BarsGV) == 0)|| (GlobalVariableGet (BarsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV, false)。

GlobalVariableSet(BarsGV, Bars);

}

//--- ロングポジション(買い)の可能性をチェック

if (GlobalVariableGet (HasOrderedGV) == false)

{

これに変更する。

int init()

{

//---

GlobalVariableSet (BarsGV, 1);

//---

return(0);

}

これはint start()の下にあります。

if (GlobalVariableGet (BarsGV) == 0);

{

Print("Error with Global Variable BarsGV", GetLastError());

return(0);

}

if (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarsGV, Bars);

//--- ロングポジション(買い)の可能性をチェック

if (GlobalVariableGet (HasOrderedGV) == false)

{

いかがでしょうか?
 

スーパースターです。ありがとうございます。

 

mladenさん、こんにちは。

この部分です。

datetime EndTime = StartTime + 60 * Period()です。

Period()は、この例では、チャートのタイムフレーム です。EndTimeは秒単位で記録されているので、240分を秒に変換してPeriod(240)の分に対応させるため、H4 (240) * 60と言うことですか?

私の読みは正しいでしょうか?

また、こうも書けるでしょうか。

datetime EndTime = (StartTime / 60) + Period();?

 

...

はい、そのとおりです。

OrderOpenTime() は標準的な datetime フォーマットで、EndTime には 1970 年 1 月 1 日からの経過秒数を指定する必要があり、あなたの書き方では分単位になってしまいます。

crsnape@btinternet.com:
mladenさん、こんにちは。

この部分です。

datetime EndTime = StartTime + 60 * Period();

Period()は、この例では、チャートのタイムフレームを表しています。つまり、H4 (240) * 60とすると、EndTimeは秒単位で記録されているので、240分を秒に変換して、Period (240)の分に対応させるということでしょうか?

私の読みは正しいでしょうか?

という書き方もできるでしょうか。

datetime EndTime = (StartTime / 60) + Period();?
 

mladenさん、このforループは最後にオープンした注文、または保留中の注文を 選択するのでしょうか?

bool UniqueOnBar (int MagicNumber)

{

datetime StartTime = Time[0];

datetime EndTime = StartTime + 60 * Period (TriggerChart);

for (int i = OrdersTotal() - 1; i >= 0; i--)

{

if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime() endTime) continue; if (OrderOpenTime() endTime) continue;

return(false);

}

だから感嘆符は'ない'と解釈されるところ、私は私が欲しいので、これは正しいイム私のインスタンスをisnt考えています。

- 最新のオープンまたは保留中の注文を選択するため、OrderSelectを残すために!を削除?

- OrderSymbol()はSymbol()と同じにする。

- OrderMagicNumber()はMagicNumberと同じになるように、、、で、これが残ります。

intTriggerChart= PERIOD_H4;

int MagicNumber = 42;

bool UniqueOnBar (int MagicNumber)

{

datetime StartTime = Time[0];

datetime EndTime = StartTime + 60 * Period(TriggerChart)。

for (int i = OrdersTotal() - 1; i >= 0; i--)

{

if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;

if (OrderSymbol() == Symbol()) continue;

if (OrderMagicNumber() == MagicNumber) continue;

if (OrderOpenTime() endTime) continue; if (OrderOpenTime() endTime) continue;

return(false);

 

私の見落としでしたが、式がtrueを返したとき、現在のバーでオープンした注文がピックアップされないことに今気づきました。

 

...

はい、そうです。だから、もしtrueを返したら、新しい注文を出すことができる。

また、もし、現在の時間 枠とは異なる時間枠で、ターゲット時間枠の現在のバーで注文がオープンされているかどうかをテストしたい場合は、この関数を次のようなものに変更することができます。

bool UniqueOnBar (int MagicNumber, int timeFrame=0)

{

if (timeFrame==0) timeFrame=Period();

datetime StartTime = iTime(NULL,timeFrame,0);

datetime EndTime = StartTime + 60*timeFrame;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol() == Symbol()) continue;

if (OrderMagicNumber() == MagicNumber) continue;

if (OrderOpenTime() EndTime) continue;

return(false);

}

return(true);

}

[/PHP]

And then the call to it would be for your example 2 posts ago

[PHP]if (UniqueOnBar(MagicNumber,TriggerChart) ... open an order

PS: 例からクローズドオーダーのチェックを削除しました。もし、クローズド・オーダーもチェックしたいのであれば、この関数の原形の2番目の部分を使用してください。

crsnape@btinternet.com:
私の見落としですが、この式がtrueを返したとき、現在のバーで未決済の注文がピックアップされないということに気づきました。
理由: