Но так как в тестере стратегий спред постоянен, возникла потребность в эмуляторе случайного спеда. Чтоб в тестере эмулировать изменения спреда, в диапазоне от 2 до 3 пунктов (4 знака) в 80% случаев, и больше 3 пунктов в 20%. Может есть идеи как это реализовать, или ссылки где подобная идея решалась.
Ошибка с магиком приводит к тому, что при закрытии по стопу советник ваш не видит, что его позиция закрыта по стопу. Почему? Отвечаю: вы открываете позиции с магиком 123, а в функцию проверки закрытия по стопу отсылаете переменную Magic. Как думаете, чему она равна при неявной инициализации? Нулю. Естественно в функции ищутся позиции с магиком 0, а он у ваших позиций равен 123. И мы не спорим, а так... рассуждаем сленца... Проверяйте реагирование на закрытия по стопу:
Остальную вашу "мёртвую" логику советника я не глядел - я вам помогал разобраться с функцией проверки закрытия по стопу...
Артем ! Добрый день! Еще раз спасибо за помощь.
Убрал всю лишнюю "мертвую" логику и "оживил" оставшуюся.... по мере своего понимания.
Оставил практически только функцию,которую Вы помогли мне исправить.
Но начали происходить чудеса не доступные для моего понимания
1. В том виде как у Вас советник открывает сделки на начале каждой свечи(у меня 5 минутки)
игнорируя при этом все указанные условия
Т.е. управление попадает в первую строку
double Price=iOpen(Symbol (),0,0);
а потом почему перепрыгивает через 11 строк и попадает в строки
2.Если же удалить строку вычисляющую минимальный лот Lot=MarketInfo(Symbol(), MODE_MINLOT);
советник работает нормально, но функция isCloseLastPosByStop не работает.
Очень долго напрягал свои извилины.....но тщетно.Буду Вам признателен если подскажете где прячется ошибка.
double Lot = 0.1; //я проинициализировал переменнуюint Magic=123;
int start()
{
double Price=iOpen(Symbol (),0,0); //запоминаем время открытия очередной свечиint ot=OrdersTotal(); //запоминаем количество всех открытых ордеровif ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point)) //И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам Lot=MarketInfo(Symbol(), MODE_MINLOT); //вычислить минимальный лот инструментаif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
{ //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
t=Lot*2; // удваиваем начальный лотOrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else//в противном случае(если функция на вернула ??????
{
Lot=0.1; // лот отстается 0.1 OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
return(0);
}
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int dg, i, j=-1, k=OrdersHistoryTotal()-1;
datetime t=0; // во избежание возможных ошибок после возможных будущих улучшенийfor (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op) continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
Всю свою " мертвую логику" убрал лишнюю и "оживил" оставшуюся.... по мере своего понимания.
Оставил практически только функцию,которую Вы помогли мне исправить.
Но начали происходить чудеса не доступные для моего понимания
После
if ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
Сделал как ты сказал.....увы советник работает ....функция isCloseLastPosByStop не работает
double Lot=0.1;
int Magic=123;
int start()
{
double Price=iOpen(Symbol (),0,0); //запоминаем время открытия очередной свечиint ot=OrdersTotal(); //запоминаем количество всех открытых ордеровif ((ot==0) //если ордеров в рынке никаких нет
&&(Bid==Price) //И ПРИ ЭТОМ если ПРИ ЭТОМ цена = цене открытия очередной свечи
&&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ если свеча N1 соответствуе этим параметрам
&&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
&&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
{ Lot=MarketInfo(Symbol(), MODE_MINLOT); //вычислить минимальный лот инструментаif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
{ //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
Lot=Lot*2; // удваиваем начальный лотOrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else//в противном случае(если функция на вернула??????
{
Lot=0.1; // лот отстается 0.1 OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
} return(0);
}
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int dg, i, j=-1, k=OrdersHistoryTotal()-1;
datetime t=0; // во избежание возможных ошибок после возможных будущих улучшенийfor (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op) continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
Ето кусок кода из функции bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
А если проскальзование в 3 пиписьки? Не продумано как-то ))
if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
Ты понимаешь - я пока на этом не заморачиваюсь....
Я целую неделю никак не могу понять почему не работает эта функция так как мне надо.
Т.е мне нужно что бы после стопа следующий ордер открылся двойным объемом от объема ордера закрывшегося по стопу,а после не стопа следующий ордер открылся обычным объемом.
Исправьте логику работы, а то еще долго будет думать
Ето кусок кода из функции bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
А если проскальзование в 3 пиписьки? Не продумано как-то ))
Ты понимаешь - я пока на этом не заморачиваюсь....
Я целую неделю никак не могу понять почему не работает эта функция так как мне надо.
Т.е мне нужно что бы после стопа следующий ордер открылся двойным объемом от объема ордера закрывшегося по стопу,а после не стопа следующий ордер открылся обычным объемом.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Добрый день.
Моя стратегия учитывает величину спреда, спред определяется функцией:
Но так как в тестере стратегий спред постоянен, возникла потребность в эмуляторе случайного спеда. Чтоб в тестере эмулировать изменения спреда, в диапазоне от 2 до 3 пунктов (4 знака) в 80% случаев, и больше 3 пунктов в 20%. Может есть идеи как это реализовать, или ссылки где подобная идея решалась.
Ошибка с магиком приводит к тому, что при закрытии по стопу советник ваш не видит, что его позиция закрыта по стопу. Почему? Отвечаю: вы открываете позиции с магиком 123, а в функцию проверки закрытия по стопу отсылаете переменную Magic. Как думаете, чему она равна при неявной инициализации? Нулю. Естественно в функции ищутся позиции с магиком 0, а он у ваших позиций равен 123. И мы не спорим, а так... рассуждаем сленца... Проверяйте реагирование на закрытия по стопу:
Остальную вашу "мёртвую" логику советника я не глядел - я вам помогал разобраться с функцией проверки закрытия по стопу...
Артем ! Добрый день! Еще раз спасибо за помощь.
Убрал всю лишнюю "мертвую" логику и "оживил" оставшуюся.... по мере своего понимания.
Оставил практически только функцию,которую Вы помогли мне исправить.
Но начали происходить чудеса не доступные для моего понимания
1. В том виде как у Вас советник открывает сделки на начале каждой свечи(у меня 5 минутки)
игнорируя при этом все указанные условия
Т.е. управление попадает в первую строку
double Price=iOpen(Symbol (),0,0);
а потом почему перепрыгивает через 11 строк и попадает в строки
Lot=0.1;
OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
2.Если же удалить строку вычисляющую минимальный лот Lot=MarketInfo(Symbol(), MODE_MINLOT);
советник работает нормально, но функция isCloseLastPosByStop не работает.
Очень долго напрягал свои извилины.....но тщетно.Буду Вам признателен если подскажете где прячется ошибка.
solnce600:
Артем ! Добрый день! Еще раз спасибо за помощь.
Всю свою " мертвую логику" убрал лишнюю и "оживил" оставшуюся.... по мере своего понимания.
Оставил практически только функцию,которую Вы помогли мне исправить.
Но начали происходить чудеса не доступные для моего понимания
После
добавте все в тело { }
Извените, что я не Артем.
solnce600:
После
добавте все в тело { }
Извените, что я не Артем.
так t или все таки Lot ???
solnce600:
После
добавте все в тело { }
Извените, что я не Артем.
Сделал как ты сказал.....увы советник работает ....функция isCloseLastPosByStop не работает
Ето кусок кода из функции bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
А если проскальзование в 3 пиписьки? Не продумано как-то ))
Ты понимаешь - я пока на этом не заморачиваюсь....
Я целую неделю никак не могу понять почему не работает эта функция так как мне надо.
Т.е мне нужно что бы после стопа следующий ордер открылся двойным объемом от объема ордера закрывшегося по стопу,а после не стопа следующий ордер открылся обычным объемом.
Исправьте логику работы, а то еще долго будет думать
Ето кусок кода из функции bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)
А если проскальзование в 3 пиписьки? Не продумано как-то ))
Ты понимаешь - я пока на этом не заморачиваюсь....
Я целую неделю никак не могу понять почему не работает эта функция так как мне надо.
Т.е мне нужно что бы после стопа следующий ордер открылся двойным объемом от объема ордера закрывшегося по стопу,а после не стопа следующий ордер открылся обычным объемом.А зачем историю ордеров трогать? посотри на баланс - куда пошел в ту сторону и меняй лот.
Если на щету будет торговать исключительно робот.