input int StartHour = 23; // Время ачало торговли input int TakeProfit = 40; // TakeProfit input int StopLoss = 40; // StopLoss input int Lots = 0.1; // Лот для торговли input int Magic = 22; // Магическое число input int Trals = 20; // Дистанция тралинга в пунктах input int _Step = 1; // Шаг input bool _StepUse = true; // Использовать шаг или нет
input int StartHour = 23; // Время ачало торговли input int TakeProfit = 40; // TakeProfit input int StopLoss = 40; // StopLoss input int Lots = 0.1; // Лот для торговли input int Magic = 22; // Магическое число input int Trals = 20; // Дистанция тралинга в пунктах input int _Step = 1; // Шаг input bool _StepUse = true; // Использовать шаг или нет
input int StartHour = 1; // Начало торговли input int TakeProfit = 40; // TakeProfit input int StopLoss = 10; // StopLoss extern double Lots = 0.1; // Лот для торговли input int Magic = 22; // Магическое число input int Trals = 5; // Дистанция тралинга в пунктах input int _Step = 1; // Шаг input bool _StepUse = false; // Использовать шаг или неT
void OnTick() { static bool IsFirstTick = false;
Trailing();
if (StartHour != Hour()) { return;} if (OrdersTotal()>0) { OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic); OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic); } }
//+------------------------------------------------------------------+ void Trailing() { if (_StepUse) { for (int trall=0; trall<OrdersTotal(); trall++) { if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue; if (OrderSymbol() != Symbol()) continue;
if (StartHour != TimeHour(Time[0])) { return;}//Если час текущей свечи не равен StartHour то выход из функции и тогда ниже написанный код выполнятся не будет, в том числе и трейлинг стоп.
if (OrdersTotal()>0)
{
....
}
に置き換えてください。
if (OrdersTotal()==0)
{
bool rezult = false;
rezult=OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
if (!rezult) Print("Ошибка открытия ордера BUY LIMIT");
rezult = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
if (!rezult) Print("Ошибка открытия ордера SELL LIMIT");
//для работы в реале надо сделать более детальную проверку ошибок
} else Trailing();
void Trailing()
{
if (_StepUse)//если false то код внутри скобок выполнятся не будет.
{
......
}
}// Скорее всего вы этот код просто бездумно скопировали от куда нибудь, даже не понимая как он работает.
助けが必要です。
http://forum.mql4.com/ru/67309#1011467
アドバイスお願いします:注文が毎日開かれない トローリングが機能せず、開いた注文がTPに従わずに閉じられる。私は何を間違えているのでしょうか?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
static bool IsFirstTick = false;
static int ticket = 0;
double lot=Lot_Normalize(Symbol(),Lots,1);
double sl= Dist_Normalize(Symbol(),Trals);
double step= Dist_Normalize(Symbol(),_Step);
int h= TimeHour(TimeCurrent());
if(h == StartHour)
{
Alert("TimeHor: ", h);
if (IsFirstTick == true)
IsFirstTick = false;
bool res;
res= OrderSelect(ticket, SELECT_BY_TICKET);
if(res == true)
{
if(OrderCloseTime() == 0)
{
bool res2;
res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
if(res2 == false)
{
Alert("Error Closing Order #", ticket);
} Alert("Closing Order #", ticket);
}
}
if(Open[0] < Open[StartHour])
{
ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! BUY_LIMIT");
}
else
{
ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! SEL_LLIMIT");
}
}
}
double Dist_Normalize(string Smv, int _Distancia)
{
int Dig= int(MarketInfo(Smv,MODE_DIGITS));
double Pip=MarketInfo(Smv,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*10*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
double Lot_Normalize(string Smv, double _lot, double _mult)
{
double minlot=MarketInfo(Smv,MODE_MINLOT);
double maxlot=MarketInfo(Smv,MODE_MAXLOT);
double steplot=MarketInfo(Smv,MODE_LOTSTEP);
double lot= _lot*_mult;
if(lot<=minlot) lot+minlot;
else if(lot>=maxlot) lot=minlot;
else if(lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
for(int pos=OrdersTotal()-1; pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if(OrderType()==OP_BUY)
{
if(_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
}
}
}
}
アドバイスお願いします:注文が毎日開かれない トローリングが機能せず、開いた注文がTPに従わずに閉じられる。私は何を間違えているのでしょうか?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
......
IsFirstTick = falseと する。
私なら、この作品を次のように置き換えます。
TM 変数がOnTick() 関数の 外側で DateTime として宣言されている場合、つまりこのモジュールのグローバル変数である場合。
私はこのコードを理解していない:もし(Open[0] < Open[StartHour])。
StartHourは23となり、0本目のバーの建値とその前の23本目のバーの建値を比較することを示唆しています。まあ、いいや、Expert Advisorのトリックかもしれないね。
しかし、このデザインはまったく適切ではありません。
チケット変数がゼロに等しい場合、またはEAが再初期化され、この変数がデフォルトでリセットされた場合はどうなりますか?
StartHourは、EAが動作する時間帯です。午前1時になるはずです。なぜ、トローリングがうまくいかないのか?
なぜ動かないのかを理解するためには、コードを解析する必要があります。
Tralling_Stop() 関数にPrint("Tralling_Stop")関数を 挿入してみて、このメッセージ (Tralling_Stop) がログに表示されるかどうか、表示されなければ、この関数が呼び出されていないことを確認します。もしそうなら、関数Tralling_Stop()自体を解析してください。もしかしたら、論理的なエラーが含まれているかもしれません。
一般に、論理的なif条件があるところには、Print(" 条件1" )、Print(" 条件2" )などと挿入します。ストラテジーテスターでExpert Advisorを実行すると、ジャーナルでEAのロジックをトレースすることができます。
なぜ動かないのかを理解するためには、コードを解析する必要があります。
Tralling_Stop() 関数にPrint("Tralling_Stop")関数を 挿入してみて、このメッセージ (Tralling_Stop) がログに表示されるかどうか、表示されなければ、この関数が呼び出されていないことを確認します。もしそうなら、関数Tralling_Stop()自体を解析してください - おそらくその中にいくつかの論理的な誤りがあります。
一般に、論理的なif条件があるところには、Print(" 条件1" )、Print(" 条件2" ) などを挿入します。ストラテジーテスターでExpert Advisorを実行すると、ジャーナルでEAのロジックをトレースすることができます。
書き換えてみましたが、まだ必要なようには動きません。欲しい時に注文が開けない、それからトリミングができない。エキスパートアドバイザーは、1日の最後のローソク足の終値(00:00)で、High(買い)とLow(売り)の2つの注文をオープンし、それをトリルするだけでよいという考え方です。
input int StartHour = 1; // Начало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 10; // StopLoss
extern double Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 5; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = false; // Использовать шаг или неT
void OnTick()
{
static bool IsFirstTick = false;
Trailing();
if (StartHour != Hour()) { return;}
if (OrdersTotal()>0)
{
OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
}
}
//+------------------------------------------------------------------+
void Trailing()
{
if (_StepUse)
{
for (int trall=0; trall<OrdersTotal(); trall++) {
if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == OP_BUY ) {
if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL) {
if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
}
}
}
//+------------------------------------------------------------------+
トライ
に置き換えてください。
に置き換えてください。
さらに、NormalizeDouble() を使用して価格を正規化する必要があります。つまり、Low[1]-StopLoss*Point の代わりに NormalizeDouble(Low[1]-StopLoss*Point,Digits()) と記述する必要があります。
また、あなたのコードによると、_StepUse変数がfalseに等しい場合、トレーリングストップは機能しません。Trailing()関数のコードをよく見てください。
トライ
に置き換えてください。
に置き換えてください。
さらに、NormalizeDouble() を使用して価格を正規化する必要があります。つまり、Low[1]-StopLoss*Point の代わりに NormalizeDouble(Low[1]-StopLoss*Point,Digits()) と記述する必要があります。
また、あなたのコードによると、_StepUse変数がfalseに等しい場合、トレーリングストップは機能しません。Trailing()関数のコードをよく見てください。
接触していますか?http://vk.com/computerwizard116、メッセージを送ってください。EAの問題をどう解決したらいいのかわからなくなった。私のデモ口座では、このストラテジーに1週間取り組んできました。
そして、それが功を奏する。しかもテストでは、このラスボスはテイクアウトポイントまで注文を閉じない((( 写真では、テイクアウトポイントを超えて、戻っているのがわかるが、損切りで閉じている、くそー(((
なぜ、そんなことを?
接触していますか?メールでのお問い合わせは、http://vk.com/computerwizard116。EAの問題をどう解決したらいいのかわからなくなった。このストラテジーをデモ口座で1週間使ってみたところ
で、動作します。しかし、テストしてみると、このラスボスは注文をテイクアウェイに閉じることすらしない。 ((( 写真では、テイクアウェイを超えて、戻っていったのがわかるが、損切りで終了している。
なぜ、そんなことをするのか?
コンタクトをとっていない。
テイクプロフィットやストップロスの注文執行は、アドバイザーに依存せず、ブローカーのサーバーで実行されます。EAはテイクプロフィットやストップロスを設定するだけで、実行はしません。価格がこの値に達した後、テイクプロフィットがすでに設定されているかどうかを確認します。つまり、先に注文を出し、その後、価格が行ったり来たりしているうちに、テイクプロフィットが設定されたのである。
コンタクトをとっていない。
利食い、損切りの注文は EAに依存せず、ブローカーのサーバーで執行されます。EAはテイクオーダーとストップオーダーを設定するだけで、実行はしません。価格がこの値に達した後、テイクプロフィットがすでに設定されているかどうかを確認します。つまり、まず注文を出し、その後価格が一進一退を繰り返し、テイクプロフィットが設定されたのです。