int start()
{
if(IsNewCandle())
{
CheckForMaTrade();//signals, deletions and candle trails only need checked on a new candle.
}
if(OpenOrdersThisPair(Symbol())>0)
{
if(UseMoveToBreakEven)MoveToBreakEven();//Move to b/e, normal trail and MA_trail need to trail on each tickif(Use_MA_Trail)MA_Trail();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{
if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
{
CloseHalfOrder1();
}
if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
{
CloseHalfOrder();
}
}
}
for(int b=OrdersTotal()-1; b>=0; b--)
{
if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
if( OrderType() == OP_BUYSTOP &&
OrderMagicNumber() == MagicNumber &&
OrderSymbol() == Symbol() )
{
if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)
{
Stored_BuyPrice = OrderOpenPrice();
DeleteOrder = OrderDelete(OrderTicket());
}
if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder) // If there are no open orders = place a new order.
{
int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
}
}
}
bool IsNewCandle()
{
static datetime Bar1Time;
if(Bar1Time == Time[1]) //"Time" used to be "Bars" with no brackets
return(false);
Bar1Time = Time[1]; //"Time" used to be "Bars" with no brackets
return(true);
}
//+----------------------------------------------------------------------------------------------------------------------------------------+ //Moving Average Trailing Stop Function//+----------------------------------------------------------------------------------------------------------------------------------------+ void MA_Trail()
{
double ATR = iATR(NULL,60,14,1);
double MA = iMA(NULL,60,MA_Period,0,1,0,1);
double BuyStopPriceMath = MA - ATR;
double SellStopPriceMath = MA + ATR;
double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);
for(int b=OrdersTotal()-1; b>=0; b--)
{
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
//buy order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price.if(OrderType()==OP_BUY)
{
if(OrderStopLoss() > BuyStopPrice) break;
if(OrderStopLoss() < BuyStopPrice)
bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
}
// sell order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price. if(OrderType()==OP_SELL)
{
if(OrderStopLoss() < SellStopPrice) break;
if(OrderStopLoss() > SellStopPrice)
bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
}
}
}
}
すみません - それはきちんと説明しなかった私の責任です。私はD1、4Hr、そして最後に1Hrを見て、MAが(他のフィルターの負荷の中で)ばらばらになるようにします - 一度それらがすべて並ぶと、H1では、任意のバーが21 EMAに一度引き戻すまで待ちます、そしてそこからそれは高値を超えて60 EMA - ATRの下にストップオーダーを配置することになります。
21本EMAへのプルバックは一度だけです。そこから、21本EMAへのプルバックを探すのを止めます。しかし、本来なら、1時間ごとのクローズ後に、現在開いているPENDING注文がロット、ストップ、テイクプロフィットを正確に更新していることを確認する必要があるのです。しかし、なぜ完璧に動作し、H1終値ごとに保留中の注文が更新されるときとされないときがあるのか、私には理解できないのです。保留中の注文が更新される理由は、""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0)" "です。) - ATR)".
もしそれが真でなければ、更新されません。しかし、それが真であっても、注文を削除して、新しい値で新しい注文を出すことはありません。
上記のコードで、ビデオに関連する何かを見ることができるかどうかは分かりませんが?(あなたが修正した最初のコード).その明確なことを願って?
関連する変数を表示し、Strategy Testerで 時間軸を動かし、必要ならtick by tickで、その変数が何であるかを確認する・・・そして、その変数が何かを起こすべきなのに起こさないことがわかったら、そのコードに焦点を当てることができます。
他人のコードにある単純な構文の問題を見つけるのは比較的簡単ですが、その人の戦略のコーディングの誤りを見つけるのは難しく、もっと多くの時間を要します。
このループのコードで、OrderDelete()関数が実行され、ループがH1クローズごとにループして いることを確認するにはどうしたらいいのでしょうか?ループがH1ベースで行われているかどうかを示す "int start "のところにこれがあるからでしょうか?(「IsNewCandle()」の方)。?
CheckForMATrade()は新しいバーごとに一回呼ばれます。H1チャートで実行している場合、それは新しいH1バーの開始時に一回です。
新しいバーの開始時に正しいATR値を計算していますか? あなたはバー0を開始したばかりであることを念頭に置いて、本当にバー0に基づいたMAを取得したいですか?指標は私の仕事ではないので、あなたが間違っていると言っていると思わないでください。私はただ
。
MA-ATRの計算を再確認するために印刷したところです。それは正しいです。私はそれをバー1(最も最近閉じたH1バー)で行っています。計算は正しいですが、私はただ、計算が一貫してすべてのH1バーの終値で行われているとは思いません...。
MAは1小節目にはないのですが.
もしあなたが気にしないなら、最後の質問 - 私はまだこのpoxy順序の修正エラー 1を取得しています!私は、このような注文を削除する必要があります。って、そんなことないですよ。何かアイデアはありますか?
いいところに目をつけましたね、ありがとうございます。)なぜ注文が削除されないか分かった気がします...OrderStopLossがMA-ATR以上でない場合、何もしない...だから、それは理にかなっている...ただ、時々、私はそれを見て、それは注文を削除して、それが必要なときに新しいものを配置したくないかのように、その?
もしあなたが気にしないなら、最後の質問 - 私はまだこのpoxy順序の修正エラー1を取得しています!私は、このような注文を削除する必要があります。プリントアウトすると、ここが原因だと判明しました。何かアイデアはありますか?
これが問題なのです. (OP_SELLも同様)
if( OrderStopLoss() < BuyStopPrice )
エラー1が出るのは、OrderStopLoss() == BuyStopPriceのためで、同じStopLoss値を持つように注文を修正しているため、エラー1になります。
投稿にあるリンクをたどって、目が腫れるほど読みましたか? https://www.mql5.com/en/forum/146380 この問題を無視し続けると、どんどん追いつかれ、時間を無駄にすることになります。
ビデオに添付された問題に戻ると、私はそれを解決したと思う方法は以下のとおりです、しかし、それは買い側で動作しませんか?何らかの理由で、取引は全くトリガーされません。しかし、売り手側では、それは私がそれをしたい方法EXACTLYを動作している?
買い側では、すべてがまったく逆になります。すべてのこれらのif文はちょうど移動平均です。私が変更した具体的な行は、「triggerBarTime+H1_high>= ema21」です。買い側では、「triggerBarTime+H1_low<= ema21」のようになります。「triggerBarTime」を削除すると、買い注文でも売り注文でも機能するようになります。しかし、もし私が "triggerBarTime "を残すなら、それは売り側で完全に動作します(例えば、すべてのバーで注文を閉じ、完全にそれを再計算し、調整したパラメータで新しい注文を置く!?)。しかし、買い側で何かをしようとすると、どんな注文も出せないのでしょうか?これは本当に重要な調整で、私はそれを行う必要があります。
このビデオをチェックアウト: http://screencast.com/t/uJu3nlNxAXDF - うまくいけば、これは本当によくそれを説明する必要があります!! :D:D
あなたが助けることができない場合は心配しないでください:)