#property strict;
externstring Label_TrailingStart="Pip threshold to activate TrailingStop";
externint TrailingStart=10;
externstring Label_TrailingStop="Pips trailing behind";
externint TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10,Pip=Point*10;
int TS=TrailingStart-TrailingStop;
bool UseTrailingStop=true,UseAutotrading=true;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int init(){
if(TS<stoplevel){
MessageBox("Please note: Your inputs cannot be less than the minimum levels required"+
"\nby your broker. Please reload the EA and either increase the value of the"+
"\nTrailingStart and/or decrease the value of the TrailingStop so that "+
"\nTrailingStart-TrailingStop >= "+StringConcatenate(stoplevel)+" pips");
}
return(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+int deinit(){
return(0);
}
//+------------------------------------------------------------------+//| Expert start function |//+------------------------------------------------------------------+int start(){
if(UseTrailingStop) Trailing();
if(UseAutotrading) Autotrading();
return(0);
}
//+------------------------------------------------------------------+void Trailing(){
for(int b=OrdersTotal()-1; b>=0; b--){
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY)
if((Bid-OrderOpenPrice())>(TrailingStart*Pip))
if(OrderStopLoss()<Bid-(TrailingStop*Pip))
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue);
}
for(int s=OrdersTotal()-1; s>=0; s--){
if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
if(OrderType()==OP_SELL)
if((OrderOpenPrice()-Ask)>(TrailingStart*Pip))
if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0)
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red);
}
}
void Autotrading(){
if(!IsTradeAllowed()){
MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
"\nthe chart to bring up the inputs window. Under the common tab check the box to"+
"\nallow live trading");
Sleep(50000);
}
if(!IsExpertEnabled()){
MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
Sleep(50000);
}
}
OK ありがとうございます!実は、以前ここに投稿したコードのように、最初はすべての「if」文に括弧をつけていたのですが、そのコードがうまくいかなかったので、前の投稿に貼り付けたコードをコピーするなど、いろいろ試してみました。これは私のコードでもないのですが、すべてのペアで動作するわけでもないので、もう一度括弧を置き換えて他のアドバイスに従います。 とりあえず、OrderSelectはEAが乗っているオーダーではなく、最初のオーダーのSymbolをターミナルに表示することを知ったので、実は間違ってはいなかったんです。
int start(){ for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue; // Everything below is executed if NO order is selected or a selected order is symbol double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip; if(OrderType()==OP_BUY) && Bid-OrderOpenPrice()>TSTP) && OrderStopLoss()<Bid-Trail){ if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange)) Print("Error Buy TrailingStop: ",GetLastError()); } :
あなたや他の皆さんが提供しているヘルプに本当に感謝しています。 私はそれをコンパイルするために、ここ数日間あらゆることを試してきましたが、聞かなかったことをお詫びします。 ほとんどの皆さんが、自分のコードを使うのを延期して他の人のコードを使うことを提案していますが、私は自分が間違っていることを理解しないなら、学ぶつもりはありません。私のコードは、ポジションごとに注文を数え、私の基準を満たすものだけを選択し、その特定の取引を修正するよう求めています。 これまでのところ、4ページにわたって、誰も私のコードのどの行が壊れているのかを指摘していません。私の今のゴールは、動くトレーリングストップEAを作ることではありません。実は、私のコードはJimdandyがYoutubeのTrailingstopsに関するチュートリアルに投稿したコードとほぼ同じでした。 彼とほぼ同じなので、私はコードをほぼそのままコピーしましたが(私が手動でトレードしたいことを除いて)、彼のコードも同様に時々しか動きません。
このトレードはTrailingstopが働くと指定したポイント(150ポイントでした)を300ポイント近く超えています。
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderModify = false
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Ask = 1.45926
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbypos = 0
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbyticket = 1
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: チケット = 0
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSelect = true(オーダーセレクト = true)
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrdersTotal = 16
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSymbol = EURUSD
2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828
2016.04.22 00:17:58.934 Trailing_v33 EURAUD,M15:OrderModify = false
このEAはEURAUDにのみ置かれています。 他の9つのチャートでは16のOrderが開かれています。 このペアで選択されたチケット番号は完全に間違っており、OrderSymbolも完全に間違っています。 どちらもEURUSDの注文です。 上記のことから、この場合、forループはポジション 0を選択して いますが、EURAUDはポジション14 (15-1) で選択すべきでした。 なぜ? これを無視しろと言ったのです。
上記のビデオでジムは実際にこの問題に取り組んでいて、私の問題を克服するために以下のコードを使用していると言っています。 しかし、これは注文を適切に送信するためのカウンターであり、注文をフィルタリングする機能ではありません。 私はこれをフィルタとして使用しようとしましたが、成功しませんでした。
どなたか、私のコードを批評して、ここから学べるようにしてください。時々完璧に動作するので、それほど悪いものではないことは分かっています。 ありがとうございます。
これまでのところ、4ページにわたって誰も私のコードのどの行が壊れているのかを指摘していません。
そんなことはありません!私たちはあなたのエラーを説明し、それに対する解決策を様々な形や選択肢で提示してきました。しかし、あなたはそれを無視し、自分のやり方でやり続けています。そればかりか、あなたはさらに間違いを増やして、さらに悪化させています。
画家が絵を描くことを学ぶとき、彼はまずそれをマスターした他の人たちの技術を真似ることから始めます。そして、その技術に慣れてきたところで、初めて「自分の絵の描き方」を作り始めるのです。
ここで、「私の批評」の短いリストを紹介します。
他にもいろいろありますが、最低限これだけは直してください。
コーディングは、他の言語と同じです。たしかに単語を並べるだけならできますが、それだけでは詩人にはなれません。コーディングでは、読みやすく機能的なものにするために、リズムや構造も必要なのです。
以下は、「私の批評」の短いリストです。
OK ありがとうございます!実は、以前ここに投稿したコードのように、最初はすべての「if」文に括弧をつけていたのですが、そのコードがうまくいかなかったので、前の投稿に貼り付けたコードをコピーするなど、いろいろ試してみました。これは私のコードでもないのですが、すべてのペアで動作するわけでもないので、もう一度括弧を置き換えて他のアドバイスに従います。 とりあえず、OrderSelectはEAが乗っているオーダーではなく、最初のオーダーのSymbolをターミナルに表示することを知ったので、実は間違ってはいなかったんです。
EDIT: 提案3番ありがとうございます!!これが問題だったと思います。 なぜなら、OrderはまずSymbolで選択され、次にその値が保存されなければならないからです。 そこで、変数を以下のようにこれらの関数の 下に移動させ、今はうまくいくようです(ただし、確実に知るにはもっとテストが必要です
私は、以前ここに投稿したコードのように、最初はすべての'if'ステートメントにブラケットを持っていましたが、そのコードが動作しないので、私は前の投稿に貼り付けたコードをコピーするなど、他の様々なことを試してみました。これは私のコードでもないのですが、すべてのペアで動作するわけでもないので、もう一度括弧を置き換えて他のアドバイスに従います。 とりあえず、OrderSelectはEAが乗っているオーダーではなく、最初のオーダーのSymbolをターミナルに表示することを知ったので、実は間違ってはいなかったんです。
EDIT: 提案3番ありがとうございます!!これが問題だったと思います。 なぜなら、OrderはまずSymbolで選択され、次にその値が保存されなければならないからです。 そこで、変数を以下のようにこれらの関数の下に移動させ、今はうまくいくようです(ただし、確実に知るにはもっとテストが必要です
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()!= Symbol()) continue;
double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip, SL=StopLoss*Pip;
if(OrderType()==OP_BUY){
if(Bid-OrderOpenPrice()>TSTP){
if(OrderStopLoss()<Bid-Trail){
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail, OrderTakeProfit(), Orange))
Print("Error Buy TrailingStop: ",GetLastError());
}
}
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue;
// Everything below is executed if NO order is selected or a selected order is symbol
double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip;
if(OrderType()==OP_BUY)
&& Bid-OrderOpenPrice()>TSTP)
&& OrderStopLoss()<Bid-Trail){
if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange))
Print("Error Buy TrailingStop: ",GetLastError());
}
:
これで、私の「厳しい批判」もご理解いただけたでしょうか。私は、彼らが皆の時間を浪費することを許容すると考える「簡単なこと」は 理解できますが、そうではありません。
そうなんです!残念ながら、その通りのようです!
このようにすると、stoplevelが50ポイントのすべてのペアで完全に動作しているようですが、外部変数がstoplevelよりも高い場合でも、EURAUDなどstoplevelがより高いペアでは動作しません。 だからこれは奇妙です。
また、私のコードと非常によく似た別のEAを見つけ、コードを比較しました。 私は主な違いを強調しました。
1.減算の代わりに加算
2.Point*10ではなく、全てPointで掛け算している。
3.彼はTrailingstopとTrailingstepを一緒に足し、それから1を引いてTrailingstepで注文を修正します。 もし私がこれを正しく理解するなら、Trailingstartは15ピップ(150ポイント)の移動後に起動されます。私のEAでは、価格は5ピップス遅れて、価格が再び下落してこの5ピップスレベルに達すると停止されます。 彼のEAでは、それは15ピップス後に起動されますが、それは遅れているピップスの量は19(15+5-1)であり、価格は停止するために19ピップス下落する必要があります。例として、OrderOpenPriceが1.50000の場合、価格は150ポイント上昇し1.50150となりトレーリングストップが作動します。 その後価格が1.50100まで下がると、5ピップの利益でストップアウトされます。彼のEAでは、トレーリングストップは1.50150で作動しますが、トレールは1.49960にあり、ストップがストプレベルに近いのでエラー130に なると思います。 それとも私はこれを誤解しているのでしょうか?
私の問題は、これらのうちの1つまたは複数にある可能性がありますか?
また、私のコードと非常に似たコードを持つ別のEAを見つけ、コードを比較しました。
あなたのこの論理を理解できるかどうか見てみましょう。あなたは、他の人のEAをどこからか見つけてきて、そのコードをあなたのEAに取り込もうとしていますが、あなたを助け、あなたの問題を修正するために特別に書かれたコードを取り込もうとはしていませんね!
ワオ!理にかなってる必要なときにスポックはどこにいるんだ
SPOCK、安らかに眠れ!私たちは皆、あなたがいなくて寂しいです
あなたの論理を理解できるかどうか見てみましょう。あなたは、どこからか他の人のEAを見つけてきて、そのコードを自分のものに取り込もうとしていますが、自分を助け、問題を修正するために特別に書かれたコードを取る気はないようですね。
ワオ!理にかなってる必要なときにスポックはどこにいるんだ
SPOCK、安らかに眠れ!私たちは皆、あなたがいなくて寂しいです