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

 

時間フィルタの 解決策をソートしました 閉じる すべて

外部変数

extern string timefilter="Time Filter";

extern int gmtshift=1; // gmt offset of the broker

extern bool generalfilter=false; // enable time filter

extern int starthour=7; // start hour to trade after this hour

extern int startminutes=0; // minutes of the start hour

extern int endhour=21; // stop to trade after this hour

extern int endminutes=0; // minutes of the start hour

extern bool tradesunday=true; // trade on sunday

extern bool fridayfilter=false; // enable special time filter on friday

extern int fridayhour=21; // stop to trade after this hour

extern int fridayminutes=0; // minutes of the friday hour

[/CODE]

int nstarthour,nendhour,nfridayhour;

string istarthour,istartminutes,iendhour,iendminutes,ifridayhour,ifridayminutes;

datetime tstart,tend,tfriday;[/CODE]

Place Code in Start,

[CODE] if(generalfilter){

nstarthour=starthour+(gmtshift);if(nstarthour>23)nstarthour=nstarthour-24;

if(nstarthour<10)istarthour="0"+nstarthour;

if(nstarthour>9)istarthour=nstarthour;

if(startminutes<10)istartminutes="0"+startminutes;

if(startminutes>9)istartminutes=startminutes;

tstart=StrToTime(istarthour+":"+istartminutes);

nendhour=endhour+(gmtshift);if(nendhour>23)nendhour=nendhour-24;

if(endhour<10)iendhour="0"+nendhour;

if(endhour>9)iendhour=nendhour;

if(endminutes<10)iendminutes="0"+endminutes;

if(endminutes>9)iendminutes=endminutes;

tend=StrToTime(iendhour+":"+iendminutes);

}

if(fridayfilter){

nfridayhour=fridayhour+(gmtshift);if(nfridayhour>23)nfridayhour=nfridayhour-24;

if(nfridayhour<10)ifridayhour="0"+nfridayhour;

if(nfridayhour>9)ifridayhour=nfridayhour;

if(fridayminutes<10)ifridayminutes="0"+fridayminutes;

if(fridayminutes>9)ifridayminutes=fridayminutes;

tfriday=StrToTime(ifridayhour+":"+ifridayminutes);

}

if((generalfilter && (nstarthour<nendhour && TimeCurrent()tend) || (nstarthour>nendhour && TimeCurrent()tend))

|| (tradesunday==false && DayOfWeek()==0) || (fridayfilter && DayOfWeek()==5 && TimeCurrent()>tfriday))

{

CloseAll();

Comment("Non-trading Hours All Positions Closed");

return(0);

}

and the CloseAll function.

[CODE]

void CloseAll(){

int total = OrdersTotal();

for(int i=total-1;i>=0;i--){

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type){

//Close opened long positions

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Lime); break;

//Close opened short positions

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, LightGreen );

} if(result == false){

Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

Sleep(3000);

}

}

return(0);

}

Kalenzoさん、ヒントありがとうございました。

 

ストップロス

こんにちは

私は、取引ごとのティックバリュー、最大ddとパーセンテージに基づいてSLを計算するための実験を試みています。

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

このアイデアは、ペアとペアの個々のtickvalueとロットサイズに応じて、2%のSLを設定することができるというものです。

私はそれが正しいと思うが、可能であれば、誰かがそれをチェック することを望む。

 
Beno:
こんにちは

私は、tickvalueと最大ddと取引ごとの割合に基づいてSLを計算するための実験を試みています。

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

このアイデアは、ペアとペアの個々のtickvalueとロットサイズに応じて、2%のSLを設定することができるということです。

私はその通りだと思いますが、可能であれば誰かにチェックしてもらいたいと思います。

Benoはよくやった。

魚よりも釣竿を与えた方がいいに決まってます。コメントでお役に立てたようで、とてもうれしいです。

ストップロス については、アイデアは良いのですが、逆の発想も試してみてください。

まず、ストップロスを設定します。

次にトレードサイズを設定します。

この方法では、システムのエントリー/エグジットが市場の状況に適合し、口座からX%以上のリスクを取ることはありませんが、エグジットはリスクの割合ではなく、システムのロジックに依存することになります。

 
Kalenzo:
Benoさん、お疲れ様です。

魚より釣竿を贈るのが常です。コメントでお役に立てたようで、とてもうれしいです。

ストップロスについては、アイデアは良いのですが、逆の発想も試してみてください。

まず、ストップロスを設定します。

次にトレードサイズを設定します。

この方法では、システムの入口と出口を市場の状況に合わせ、口座からX%以上のリスクを取らずに、出口はリスクの割合ではなく、システムのロジックに依存します。

こんにちは、Kalenzoです。

デモ口座とライブ口座でEAを使用したところ、Error openingSELL order: invalid stopsというエラーが発生し、トレードが開始されません。

EURUSD,Daily: modify #1 buy 0.01 EURUSD at 1.43348 sl: 1.43895 tp: 0.00000 ok

SLの0.00547ポイント差

を確認しました。

モード_freezelevel 0.0000を

モード_ストプレレベル0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

私は前にこれを遭遇したことがない。

乾杯

Beno

 

ラッチ/アンラッチ機能

mq4でラッチ/アンラッチ関数をコード化する方法はありますか? ある条件に基づいて真のビットをラッチし、別の条件によってラッチが解除されるまでこの値を保存します。

cmfxtrader

 
Beno:
こんにちは、カレンゾです。

EAがデモとライブ口座にあり、取引が開始されないのに、Error opening SELL order : invalid stopsと表示されます。

EURUSD,Daily: modify #1 buy 0.01 EURUSD at 1.43348 sl: 1.43895 tp: 0.00000 ok

SLの0.00547ポイント差

を確認しました。

モード_freezelevel 0.0000を

モード_ストプレレベル0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

私は前にこれを遭遇したことがない。

乾杯

ベノ

ストップロスが近すぎる可能性があります。ストップロスの 値を10倍にしてみてください。4桁のブローカーでシステムをテストし、5桁のブローカーで取引しているときによくある問題です。5桁のブローカーでテストすることもできますが、ブローカーに接続しない(オフラインモードで)場合、メタトレーダーは(4桁の)古い設定になってしまいます。

まずこの行から。

NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

この値 => stopLoss*pips2dbl を表示します。

とすれば、ストップロスの実際の値が分かります。

もしこの値が20や10であれば、ポイント値を乗じる必要があることを意味します。

NormalizeDouble(Ask - (stopLoss * pips2dbl) *Point, Digits);

もし0.00009であれば、0.0009になるはずなので、10倍する必要があります(もちろん9ピップのストップロスを設定したい場合)。

 
cmfxtrader:
mq4でラッチ/アンラッチ関数をコーディングする方法はありますか? ある条件に基づいて真のビットをラッチし、別の条件によってラッチが解除されるまでこの値を保存します。

よくわからないのですが、どのようなことでしょうか?eaの特定の部分(機能)をON/OFFしたいのか、ea Bの動作でea Aの機能を停止させたいのか?どちらも可能です。

 

貨幣価値から価格への変換(利益目標計算用)

バスケット取引で指定された利益目標に対する価格値を返す関数をプログラミングしたいのですが、なかなかうまくいきません。私が到達したい目標、それは利益目標を示す画面上に描かれる単純な水平線 です。しかし、利益目標は価格値ではなく、金銭的な値の形でユーザーが定義可能な変数です。(例: target = 1.2000 の代わりに target = € 100)

私がこれまでに持っているルーチン。

(私の口座はユーロ建てです!)

1) USDJPYのいくつかの買いポジションを開くとします(例の状況を作るためにランダムなポジションで)。

2) バスケットの平均オープン価格(1.1500とします、これも仮に)を計算し、これを示す水平線を表示します。

3) 利益目標を設定した変数があります:目標= € 100とします。

4) バスケットプロフィット >= ターゲットのとき、すべてのオープンポジションを正常にクローズすることができます。

その中間のステップがありません。double targetPrice(){}という関数が必要で、これはtargetPriceを返します。水平線を引くことが問題なのではありません。

targetPrice = 平均オープンプライス + マネーバリュー-ターゲット (€100)

つまり、私が知りたいのは、money-valueをpipsに変換する方法 です。この方法で平均価格にpipsを追加し、ターゲット価格を得ることができます。これは、私がEUR口座を持っていて、USDJPYを取引しているという事実を考慮しなければならないことも覚えておいてください。このような落とし穴もあるのでしょうか?

 

ECN SLが動作しない

ギドデイ

私はECN上で動作するEAをセットアップしようとしています、私はSLとTPが配置/変更されなければならないことを理解し、私はセットアップが正しいと思います、注文は今開くが、SLは配置されていない extern double StopLoss = 100; 任意の助けは素晴らしいことでしょう。

//---- buy conditions

if(buysig && ttime!=Time[0]) {

ticket = OrderSend(Symbol(), OP_BUY, lotSize, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);

if(ticket > -1){

if (!OrderSelect(ticket, SELECT_BY_TICKET)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("order "+ticket+" successfully opened");

//now enter in the SL and TP via OrderModify to make compatible with ECN broker

SL = MarketInfo(Symbol(), MODE_ASK) - (StopLoss * pips2points);

Print("Ask = " + DoubleToStr(Ask,Digits) + " : SL = " + DoubleToStr(SL,Digits));

//round to nearest Tickvalue

SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKSIZE));

Print("SL rounded: " + SL);

if(!OrderModify(ticket, entry_price, SL, 0, Blue)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("Stoploss successfully set");

ttime=Time[0];

return(0);

}

}

}

//Tickvalue Rounding

double DoubleRound(double number, double step){

double mod = MathMod(number, step);

if(mod < step/2.0)

step = 0;

double rounded = number - mod + step;

return (rounded);

}
 

,,,,,,,,,,,,,.,,,,,,,,,

ファイル:
test_ea.txt  10 kb
aizig.ex4  10 kb