приключения новичка

 

Привет, ребята, спасибо за помощь с моим кодом, сейчас 2.11 утра в Лондоне, и я уже некоторое время пытаюсь расшифровать эту загадку mql. Кстати, CodesGuru спасибо за туториалы, они понятнее, чем стандартные предлагаемые, хорошая попытка!


Я новичок в кодировании стратегии и как всегда нуждаюсь в помощи профессионалов.


Ниже приведен код, который я собрал, но по какой-то причине он исполняет только короткие сделки.


Я застрял, не зная почему. Кроме того, мне также нужно добавить следующее: 1. Код должен исполнять как длинные, так и короткие сделки, независимо от того, открыта ли уже сделка в противоположном направлении (например: если открыта длинная сделка, код все равно должен войти в короткую позицию, если условия выполнены). Я предполагаю, что мне нужно поиграть с функцией'OrdersTotal()==0;, но я не знаю, что делать.


Пожалуйста, помогите. Код прилагается. (я пытался прикрепить его, но по какой-то причине он не прикрепляется, есть идеи, что происходит?)


Я обещаю бутылку хорошего шампанского тому, кто поможет мне довести этот код до ума :-)


ps: Я тестирую это в mt4 simulator/strategy tester.


жду вашей помощи, ребята!

ник

 
//+------------------------------------------------------------------+
//|                                     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.









 
niko:
Вот это код, ребята!

Причина, по которой он никогда не делает длинный ордер, заключается в том, что вы не закрыли блок кода, который выполняет короткий ордер, закрывающей фигурной скобкой. Это означает, что по сути вы исполняете длинный ордер только если (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

 
Упс, за то время, которое мне понадобилось для ответа, другие успели быстрее ...
 
TuRRiCAN wrote >>
Упс, за то время, которое мне понадобилось для ответа, другие были быстрее...

Эй, Туррикан, это очень полезно, спасибо! С кириллицей нет проблем, я русский, вообще-то из Сибири.

Да, я изучил книгу по mql, но это все еще вне практического обучения, это совсем другое дело - изучить ее и затем попытаться написать программу самостоятельно (потому что они не объясняют четко с примерами из реальной жизни в каждой части книги, почему и как эти вещи используются, вы знаете.

Но я добьюсь своего, жгучее желание сделать это внутри меня сильнее любых препятствий.

 
niko:

Вы торгуете на живых рынках самостоятельно или работаете на metaquotes?

Отвечая на ваш вопрос, я обычно работаю пилотом вертолета. Однако, учитывая экономическую ситуацию, компания, на которую я работаю, в данный момент не хочет летать. Поэтому в промежуточный период я разрабатываю советников для компании, которая принадлежит моему лучшему приятелю. Мы торгуем в реальном времени от имени некоторых довольно известных фондов.

Я рад, что вы пытаетесь научиться кодировать, и буду помогать, когда смогу. Это освежает, когда кто-то присоединяется к форуму и хочет научиться быть самодостаточным.

Причина обращения: