//+------------------------------------------------------------------+ //| N&P 1DailyUpTrendExec.mq4 | //| Copyright Nick Lou & Pete Arh 2009 | //| 20090523 | //| | //+------------------------------------------------------------------+ extern double Lots=0.01; extern double TakeProfit=20; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(Bars<75) { Print("Bars less than 100"); return(0); } //Declaration double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3; ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0); ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0); ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0); e1under2= ema1< ema2; e2under3= ema2< ema3; e1over2= ema1> ema2; e2over3= ema2> ema3; if(OrdersTotal()==0) // one order at the time { // Short Entry static int ticket; if( e1under2 && e2under3) // short function { ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red); if( ticket>0) { if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice()); } if(OrdersTotal()==0) // one order at the time if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables { if( e1over2 && e2over3) //buy function ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss if( ticket>0) { if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } return(0); } return(0); } }это код, ребята!
Ух ты! Довольно хорошая работа по кодированию для "новичка". Вы можете написать свой код намного лаконичнее, чем я.
Я заметил, что у вас есть две одинаковые строки с условием-if для секции BUY, в то время как в секции SELL только одна.
Второе одинаковое условие-if для функции BUY, вероятно, безвредно, но так ли оно необходимо?
if(OrdersTotal()==0) // один ордер за раз
if(e1over2 && e2over3) // это может быть не совсем удобно, потому что в старой версии для всех переменных было ==1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< вот первый
{
if(e1over2 && e2over3) // функция покупки <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< вот вторая
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //Зачем 12345? Я добавил ASk-30*Point для стоп-лосса
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер BUY : ",OrderOpenPrice());
}
else Print("Ошибка открытия ордера BUY : ",GetLastError());
return(0);
}
Также, похоже, что у вас обе функции Sell и Buy содержатся внутри одного Conditional-if:
if(OrdersTotal()==0) // один ордер за раз
{
// Короткий вход
static int ticket;
if(e1under2 && e2under3) // короткая функция
{ // Соответствующая скобка для этого находится намного ниже функций SELL и BUY<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< см. ниже
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point, "Short Order ",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер SHORT : ",OrderOpenPrice());
}
if(OrdersTotal()==0) //один ордер за раз
if(e1over2 && e2over3) //это может быть грязно, потому что в старой версии было ==1 для всех переменных
{
if(e1over2 && e2over3) //функция покупки
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //Зачем 12345? Я добавил ASk-30*Point для стоп-лосса
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер BUY : ",OrderOpenPrice());
}
else Print("Ошибка открытия ордера BUY : ",GetLastError());
return(0);
}
return(0);
} // это скобка, соответствующая той, что показана выше<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< см. выше
return(0);
}
}
Ордер BUY подчиняется критериям SELL так, как у вас организовано отмеченное условное-if.
Вот это код, ребята!
Причина, по которой он никогда не делает длинный ордер, заключается в том, что вы не закрыли блок кода, который выполняет короткий ордер, закрывающей фигурной скобкой. Это означает, что по сути вы исполняете длинный ордер только если (e1under2 && & e2under3) И (e1over2 && & e2over3), чего, как я полагаю, не произойдет.
Вы говорите, что хотите открыть ордер, даже если уже есть ордер, открытый в другом направлении. Из этого я предполагаю, что вы хотите ограничить количество ордеров максимум одним в каждом направлении. Включая проверку того, что OrdersTotal() равен нулю, вы ограничиваетесь 1 ордером в целом, а не одним в каждом направлении. Что вам нужно сделать, так это проверить количество и тип существующих ордеров с помощью цикла и счетчиков (много примеров на этом сайте), а затем использовать результат для определения того, нужно ли делать ордер.
Я заметил в другом вашем сообщении, как вы упомянули, что хотите научиться писать на MQL, поэтому я не собираюсь писать это за вас. Этот пример - именно тот тип простого кода и логики, который необходим в процессе обучения.
Пожалуйста, сделайте это для себя и дайте мне знать, как вы справитесь.
Эй, ребята, вы просто легенды!!!
Спасибо за ваши комментарии FXTrader2008 и cloudbreaker. Я не заметил, что было повторное условие для покупки, я вырезал его, и это имеет смысл в отношении того, что скобка не закрывается. Хорошая идея не давать мне закодированный ответ, поскольку я хочу сам изучить код. Я посмотрю в Интернете, что такое цикл/счетчики.
Причина, по которой код такой красивый и компактный, в том, что мой друг помог мне его составить (он программист).
Я продолжу с моей стороны, и если я застряну, я дам вам знать!
Ребята, вы торгуете на живых рынках самостоятельно или работаете на metaquotes?
Я не заглядывал глубоко в ваш код, но один первый совет:
Постарайтесь структурировать свой код более четко - мы делаем это не для развлечения, а для лучшего чтения и понимания! Это никак не влияет на "смысл" или значение кода...
Давайте посмотрим, как ДОЛЖЕН выглядеть ваш код (только основная часть):
if(OrdersTotal()==0) // one order at the time
{
// Short Entry
static int ticket;
if( e1under2 && e2under3) // short function
{
ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);
if( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
}
if(OrdersTotal()==0) // one order at the time
if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables
{
if( e1over2 && e2over3) //buy function
ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss
if( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
return(0);
}
return(0);
}
Как вы можете видеть сейчас: Вы проверяете только ваше "короткое" условие
// Short Entry
static int ticket;
if( e1under2 && e2under3) // short function
а внутри него вы проверяете "длинное" условие, дважды - для безопасности ; ) - это не может работать.
if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables
{
if( e1over2 && e2over3) //buy function
Лучше: (но до совершенства еще далеко)
if(OrdersTotal()==0) // one order at the time
{
// Short Entry
static int ticket;
if ( e1under2 && e2under3) // short function
{
ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);
if ( ticket>0)
{
if (OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
} }
if( e1over2 && e2over3) //buy function {
ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss
if ( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
}
return(0);
}
Теперь она должна работать для коротких и длинных сделок.
Очень рекомендую прочитать вот эту книгу о MQL4 - особенно раздел Создание нормальной программы - там очень хорошо написано и вы сможете легко реализовать свою стратегию. Я тоже так начинал...
Если вы скачаете там файлы и у вас возникнут проблемы с комментариями (так как они кириллические), откройте "word", скопируйте и вставьте исходник каждого файла с интернет-страницы (так как комментарии там английские) в word и, наконец, скопируйте и вставьте из word в Metaeditor. С этого момента вы можете изучать программы на английском языке.
Надеюсь, я смог помочь...
(Кстати: Я тоже очень новичок в MQL4, но я работаю программистом и поэтому синтаксис и структура для меня не проблема...).
Приветствую TuRRiCAN
Эй, Туррикан, это очень полезно, спасибо! С кириллицей нет проблем, я русский, вообще-то из Сибири.
Да, я изучил книгу по mql, но это все еще вне практического обучения, это совсем другое дело - изучить ее и затем попытаться написать программу самостоятельно (потому что они не объясняют четко с примерами из реальной жизни в каждой части книги, почему и как эти вещи используются, вы знаете.
Но я добьюсь своего, жгучее желание сделать это внутри меня сильнее любых препятствий.
Вы торгуете на живых рынках самостоятельно или работаете на metaquotes?
Отвечая на ваш вопрос, я обычно работаю пилотом вертолета. Однако, учитывая экономическую ситуацию, компания, на которую я работаю, в данный момент не хочет летать. Поэтому в промежуточный период я разрабатываю советников для компании, которая принадлежит моему лучшему приятелю. Мы торгуем в реальном времени от имени некоторых довольно известных фондов.
Я рад, что вы пытаетесь научиться кодировать, и буду помогать, когда смогу. Это освежает, когда кто-то присоединяется к форуму и хочет научиться быть самодостаточным.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Привет, ребята, спасибо за помощь с моим кодом, сейчас 2.11 утра в Лондоне, и я уже некоторое время пытаюсь расшифровать эту загадку mql. Кстати, CodesGuru спасибо за туториалы, они понятнее, чем стандартные предлагаемые, хорошая попытка!
Я новичок в кодировании стратегии и как всегда нуждаюсь в помощи профессионалов.
Ниже приведен код, который я собрал, но по какой-то причине он исполняет только короткие сделки.
Я застрял, не зная почему. Кроме того, мне также нужно добавить следующее: 1. Код должен исполнять как длинные, так и короткие сделки, независимо от того, открыта ли уже сделка в противоположном направлении (например: если открыта длинная сделка, код все равно должен войти в короткую позицию, если условия выполнены). Я предполагаю, что мне нужно поиграть с функцией'OrdersTotal()==0;, но я не знаю, что делать.
Пожалуйста, помогите. Код прилагается. (я пытался прикрепить его, но по какой-то причине он не прикрепляется, есть идеи, что происходит?)
Я обещаю бутылку хорошего шампанского тому, кто поможет мне довести этот код до ума :-)
ps: Я тестирую это в mt4 simulator/strategy tester.
жду вашей помощи, ребята!
ник