Здравствуйте, подскажите, плиз, почему не работает. Ошибок нет, но ордера не открывает в тестере. В качестве тренировки пытаюсь написать советник на пробой хай, лоу дневной свечи.
externint TimeCandle = 1440; //таймфрейм свечи, которую пробиваем externint HourStart=10; // час начала торговлиexterndouble Lots=0.1; // лот торговли externint StopLoss=100; // стоплоссexternint TakeProfit=100; // тайкпрофитexternint znak=5; // количество знаков котировкиexternint magik=54321; // магик double minprice; // минимальная ценаdouble maxprice;// максимальная ценаvoidOnTick()
{
double SL, TP;
int ticket;
minprice = iLow(Symbol(),TimeCandle,1);
maxprice = iHigh(Symbol(),TimeCandle,1);
if (TimeHour(TimeCurrent()==HourStart))
{
if (BuyLimitCount()==0 && BuyCount()==0) //если нет ордера то пытаться открыть
{
SL = NormalizeDouble(maxprice - StopLoss*Point,znak);
TP = NormalizeDouble(maxprice + TakeProfit*Point,znak);
ticket = OrderSend(Symbol(), OP_BUYLIMIT,Lots,maxprice, 10, SL,TP,"", magik,0,Blue);
if (ticket <0)
Print ("Не удалось открыть ордер на покупку");
}
if (SellLimitCount()==0 && SellCount()==0) //если нет ордера то пытаться открыть
{
SL = NormalizeDouble(minprice + StopLoss*Point,znak);
TP = NormalizeDouble(minprice - TakeProfit*Point,znak);
ticket = OrderSend(Symbol(), OP_SELLLIMIT,Lots,minprice,10, SL,TP,"", magik,0,Red);
if (ticket <0)
Print ("Не удалось открыть ордер на продажу");
}
}
Comment ("Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:"+ DoubleToStr(maxprice, znak));
}
// проверяем есть ли байлимит ордера с концаint BuyLimitCount()
{
int count = 0;
for (int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&
OrderMagicNumber()== magik &&
OrderType() == OP_BUYLIMIT )
{
count ++;
}
}
return(count);
}
// проверяем есть ли селллимит ордера с концаint SellLimitCount()
{
int count = 0;
for (int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&
OrderMagicNumber()== magik &&
OrderType() == OP_SELLLIMIT )
{
count ++;
}
}
return(count);
}
// проверяем есть ли бай ордера с концаint BuyCount()
{
int count = 0;
for (int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&
OrderMagicNumber()== magik &&
OrderType() == OP_BUY )
{
count ++;
}
}
return(count);
}
// проверяем есть ли селл ордера с концаint SellCount()
{
int count = 0;
for (int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&
OrderMagicNumber()== magik &&
OrderType() == OP_SELL )
{
count ++;
}
}
return(count);
}
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
Здравствуйте, подскажите, плиз, почему не работает. Ошибок нет, но ордера не открывает в тестере. В качестве тренировки пытаюсь написать советник на пробой хай, лоу дневной свечи.
Не открывает - в смысле и не пытается или пытается но не получается ? Что пишут в журнале ?
Здравствуйте, подскажите, плиз, почему не работает. Ошибок нет, но ордера не открывает в тестере. В качестве тренировки пытаюсь написать советник на пробой хай, лоу дневной свечи.
Проанализируйте вот это Ваше выражение
if (TimeHour(TimeCurrent()==HourStart))
{
........
}
Мне трудно осознать смысл этого выражения, возможно я не прав, но как минимум замените "(TimeCurrent()==HourStart)" на "(TimeCurrent() - HourStart)".
Дальше, если я Вас правильно понял - Вы пытаетесь выставить БайЛимит ордер, если нету БайЛимитОрдера И БайПозиции. Обратите внимание именно "И". То-есть наличие любого из них в отдельности Вас устраивает, таким образом, при нужном положении текущей цены Вы получите бесконечно кол-во БайЛимитов, по одному на каждом тике, пока хотя-бы один из них не сработает и не откроется первая позиция. Ещё - Вам не важно где сейчас находится цена. Как только выполнится странное условие по времени (чуть выше постом), думаю там ошибка, ну да ладно. Так вот, если его не учитывать, советник с первого же тика начнет выставлять ошибочные ордера, пока цена не уйдет выше вчерашнего максимума, так как в качестве цены для выставления ордера Вы используете Вчерашний максимум. БайЛимит выставляется под текущей ценой, значит текущая цена должна быть выше вчерашнего максимума, а до тех пор будут отказы в исполнении.
Таким образом Вам подходит только ситуация когда цена ушла выше вчерашнего максимума, нет БайЛимитов и нет открытых покупок. Довольно редкая комбинация. К тому же она не на пробитие получится, а на откат после пробития (потому-что БайЛИМИТ), да еще к тому-же долго будет закидывать Вас ошибками, начиная с первого тика, выше цены вчерашнего максимума (это уже другая ошибка). Условие уже выполняется, советник кидает заявку, но ведь есть еще спред, минимальное разрешённое расстояние от рынка и тд.
Мне кажется это не верным решением. Вероятно я что-то упустил. Прошу помочь разобраться.
Вас срочно нужно нанимать на работу в Microsoft, что бы они наконец-то исправили это "не верное решение" по работе с файлами.
Работа с файлами - это не то же что редактирование файла в файловом редакторе, это скорее как составление слова из кубиков с отдельными буквами. Если нужно вставить новую букву, то все последующие за ней кубики нужно передвинуть вправо. Если нужно удалить старую букву, то все последующие за ней кубики нужно передвинуть влево. По этому, если файл не большой и в рамках работы не требуется shared доступ к файлу, то, действительно, проще записать данные в новый файл, удалить старый, переименовать новый файл на имя старого.
Если не ошибаюсь, то единственное, чего не хватает в MQL при работе с файлами - это возможность обрезать длину файла до необходимого размера.
Вас срочно нужно нанимать на работу в Microsoft, что бы они наконец-то исправили это "не верное решение" по работе с файлами.
Работа с файлами - это не то же что редактирование файла в файловом редакторе, это скорее как составление слова из кубиков с отдельными буквами. Если нужно вставить новую букву, то все последующие за ней кубики нужно передвинуть вправо. Если нужно удалить старую букву, то все последующие за ней кубики нужно передвинуть влево. По этому, если файл не большой и в рамках работы не требуется shared доступ к файлу, то, действительно, проще записать данные в новый файл, удалить старый, переименовать новый файл на имя старого.
Если не ошибаюсь, то единственное, чего не хватает в MQL при работе с файлами - это возможность обрезать длину файла до необходимого размера.
Спасибо. Хорошее объяснение. К сожалению мой файл очень большой и поэтому придется поработать с "кубиками".
Здравствуйте, подскажите, плиз, почему не работает. Ошибок нет, но ордера не открывает в тестере. В качестве тренировки пытаюсь написать советник на пробой хай, лоу дневной свечи.
Здравствуйте, подскажите, плиз, почему не работает. Ошибок нет, но ордера не открывает в тестере. В качестве тренировки пытаюсь написать советник на пробой хай, лоу дневной свечи.
Не открывает - в смысле и не пытается или пытается но не получается ? Что пишут в журнале ?
Здравствуйте, подскажите, плиз, почему не работает. Ошибок нет, но ордера не открывает в тестере. В качестве тренировки пытаюсь написать советник на пробой хай, лоу дневной свечи.
Проанализируйте вот это Ваше выражение
Мне трудно осознать смысл этого выражения, возможно я не прав, но как минимум замените "(TimeCurrent()==HourStart)" на "(TimeCurrent() - HourStart)".
Дальше, если я Вас правильно понял - Вы пытаетесь выставить БайЛимит ордер, если нету БайЛимитОрдера И БайПозиции. Обратите внимание именно "И". То-есть наличие любого из них в отдельности Вас устраивает, таким образом, при нужном положении текущей цены Вы получите бесконечно кол-во БайЛимитов, по одному на каждом тике, пока хотя-бы один из них не сработает и не откроется первая позиция. Ещё - Вам не важно где сейчас находится цена. Как только выполнится странное условие по времени (чуть выше постом), думаю там ошибка, ну да ладно. Так вот, если его не учитывать, советник с первого же тика начнет выставлять ошибочные ордера, пока цена не уйдет выше вчерашнего максимума, так как в качестве цены для выставления ордера Вы используете Вчерашний максимум. БайЛимит выставляется под текущей ценой, значит текущая цена должна быть выше вчерашнего максимума, а до тех пор будут отказы в исполнении.
Таким образом Вам подходит только ситуация когда цена ушла выше вчерашнего максимума, нет БайЛимитов и нет открытых покупок. Довольно редкая комбинация. К тому же она не на пробитие получится, а на откат после пробития (потому-что БайЛИМИТ), да еще к тому-же долго будет закидывать Вас ошибками, начиная с первого тика, выше цены вчерашнего максимума (это уже другая ошибка). Условие уже выполняется, советник кидает заявку, но ведь есть еще спред, минимальное разрешённое расстояние от рынка и тд.
Мне трудно осознать смысл этого выражения, возможно я не прав, но как минимум замените "(TimeCurrent()==HourStart)" на "(TimeCurrent() - HourStart)".
Все верно тут ошибка. Нужно if (TimeHour(TimeCurrent())==HourStart)
Теперь открывает сделки иногда, но больше ошибками закидывает(OrderSend error 130).
Насчет лимитных ордеров тут не правильно.
Все верно тут ошибка. Нужно if (TimeHour(TimeCurrent())==HourStart)
Теперь открывает сделки иногда, но больше ошибками закидывает(OrderSend error 130).
Насчет лимитных ордеров тут не правильно.
Вот вам скрипт, для работы со временем.
Старенький, но работает корректно.
Здравствуйте.
Прошу Вас помочь мне разобраться в работе с файлами.
При работе программы полученные данные сохраняю в файл и считываю CSV.
Файл увеличивается. скорость падает. Попробовал обновить (переписать) некоторые элементы в строках. Не вышло!
Удалить выбранную строку- невозможно! Дописать новый элемент в старую строку не получается!
Очень странно! Можно легко удалить файл, графический объект и т.п. А когда касается работы с созданным файлом, полный тупик!
На форумах только одна рекоммендация : "Считать файл в память , поменять или стереть строку, и сокранить новый файл под старым названием".
Мне кажется это не верным решением. Вероятно я что-то упустил. Прошу помочь разобраться.
Мне кажется это не верным решением. Вероятно я что-то упустил. Прошу помочь разобраться.
Вас срочно нужно нанимать на работу в Microsoft, что бы они наконец-то исправили это "не верное решение" по работе с файлами.
Работа с файлами - это не то же что редактирование файла в файловом редакторе, это скорее как составление слова из кубиков с отдельными буквами.
Если нужно вставить новую букву, то все последующие за ней кубики нужно передвинуть вправо.
Если нужно удалить старую букву, то все последующие за ней кубики нужно передвинуть влево.
По этому, если файл не большой и в рамках работы не требуется shared доступ к файлу, то, действительно, проще записать данные в новый файл, удалить старый, переименовать новый файл на имя старого.
Если не ошибаюсь, то единственное, чего не хватает в MQL при работе с файлами - это возможность обрезать длину файла до необходимого размера.
Вот вам скрипт, для работы со временем.
Старенький, но работает корректно.
я тож раньше Кимовской ф-цией пользовался, потом нашел время написал себе так:
отключать время работы - нужно ввести некоректные данные при инициализации конструктора, например 25 часов или 70 минутВас срочно нужно нанимать на работу в Microsoft, что бы они наконец-то исправили это "не верное решение" по работе с файлами.
Работа с файлами - это не то же что редактирование файла в файловом редакторе, это скорее как составление слова из кубиков с отдельными буквами.
Если нужно вставить новую букву, то все последующие за ней кубики нужно передвинуть вправо.
Если нужно удалить старую букву, то все последующие за ней кубики нужно передвинуть влево.
По этому, если файл не большой и в рамках работы не требуется shared доступ к файлу, то, действительно, проще записать данные в новый файл, удалить старый, переименовать новый файл на имя старого.
Если не ошибаюсь, то единственное, чего не хватает в MQL при работе с файлами - это возможность обрезать длину файла до необходимого размера.