Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Нужна помощь.
http://forum.mql4.com/ru/67309#1011467
Подскажите: ордера открываются не каждый день траллинг не работает и закрываются открытые ордера не по ТП. В чем я ошибся ?
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());
}
}
}
}
}
}
Подскажите: ордера открываются не каждый день траллинг не работает и закрываются открытые ордера не по ТП. В чем я ошибся ?
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;
Это кусок я бы заменил на
где переменная ТМ объявлена как DateTime вне функции OnTick(), то есть она глобальная для данного модуля.
Не понятен вот это код : if(Open[0] < Open[StartHour])
StartHour у вас равен 23 и получается вы сравниваете цену открытия нулевого бара с ценой открытия 23-го бара назад. Ну да ладно возможно это такая фишка у советника.
Но вот эта конструкция вообще не годная
А если у вас переменная ticket равна нулю, или была переинициализация советника и переменная эта была сброшена по умолчанию?
StartHour это время когда советник должен работать. Там должно быть час ночи. А почему траллинг не работает ?
Надо анализировать код, что бы понять почему он не работает.
Попробуйте вставить в функцию Tralling_Stop() функцию Print("Tralling_Stop"), и смотрите в журнале будет ли там это сообщение (Tralling_Stop), если нет, то значит эта функция не вызывается. Если есть то анализируйте саму функцию Tralling_Stop() может в ней какие то логические ошибки.
Вообщем везде где есть логические условия if вставьте Print(" сработало условие 1" ), Print(" сработало условие 2" ) и т.д. Запустите советника в тестере и в журнале сможете отследить логику работы вашего эксперта.
Надо анализировать код, что бы понять почему он не работает.
Попробуйте вставить в функцию Tralling_Stop() функцию Print("Tralling_Stop"), и смотрите в журнале будет ли там это сообщение (Tralling_Stop), если нет, то значит эта функция не вызывается. Если есть то анализируйте саму функцию Tralling_Stop() может в ней какие то логические ошибки.
Вообщем везде где есть логические условия if вставьте Print(" сработало условие 1" ), Print(" сработало условие 2" ) и т.д. Запустите советника в тестере и в журнале сможете отследить логику работы вашего эксперта.
Пробовал переписать но все равно работает не так как мне надо. То ордера не открываются когда надо, то не траллит. По идеи советник должен работать так: По закрытии последней свечи за сутки ( это в 00:00 часов ) должен открыть две отложки по High (на бай) и по Low (на сел) после чего просто их траллить. через сутки все повторяется.
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. Я уже не знаю как решит проблему советника. На демо счете неделю работал по этой стратегии
и он работает. А при тестировании этот гаденыш даже ордера то тейку не закрывает(((((( На фото видно как цена вышла за тейк и вернулась обратно а он закрыл в убыток зараза!(((
Почему он так делает ?
Ты в контакте есть ? Напиши мне http://vk.com/computerwizard116. Я уже не знаю как решит проблему советника. На демо счете неделю работал по этой стратегии
и он работает. А при тестировании этот гаденыш даже ордера то тейку не закрывает(((((( На фото видно как цена вышла за тейк и вернулась обратно а он закрыл в убыток зараза!(((
Почему он так делает ?
Меня нет в контакте.
Исполнение ордеров тейк профит и стоп лосс не зависит от советника, они исполняются на сервере брокера. Советник, только устанавливает тейк и стоп, а не исполняет их. Проверьте может тейк профит был установлен уже после того как цена достигла этого значения. То есть сначала был открыт ордер потом цена гуляла туда сюда после чего был установлен тейк профит.
Меня нет в контакте.
Исполнение ордеров тейк профит и стоп лосс не зависит от советника, они исполняются на сервере брокера. Советник, только устанавливает тейк и стоп, а не исполняет их. Проверьте может тейк профит был установлен уже после того как цена достигла этого значения. То есть сначала был открыт ордер потом цена гуляла туда сюда после чего был установлен тейк профит.