приключения новичка - страница 4

 

Здравствуйте, легенды mql. Я приготовил для вас псевдокод во время обеденного перерыва на работе. Вот он. Дайте мне знать, чего не хватает, и я добавлю это.

Псевдокод N&P
В этой стратегии мы хотим иметь один код, иметь возможность прикрепить его к любому графику, и он будет работать на 5 валютах, входя в короткие и длинные позиции по каждой из них при соблюдении правил.
---EURUSD---
Если ema7>ema14>sma50 и PriceNow < TopFilterLevel (например: 1.3080 для eurusd. Это я буду корректировать на ежедневной основе), то:
Покупаем лоты EURUSD (лоты должны быть внешней переменной, например, 0.01). Иначе: (т.е. условия не выполнены) не покупать.

Если ema7<ema14<sma50 и PriceNow > BottomFilterLevel (например: 1.1508 для eurusd), то:
Короткие лоты EURUSD (опять же, внешняя переменная). Иначе (т.е. если условия не выполнены, не шортить).

Если позиция BUY достигает 20 пунктов от точки входа, то: TAKEPROFIT по EURUSD.
Если позиция SHORT достигает 20 пунктов от точки входа, то: TAKEPROFIT на EURUSD.
Если 20 пунктов не достигнуты (ни покупка, ни продажа), то продолжайте находиться в рынке до закрытия позиции.

вручную. (в идеале мы поместим это в функцию OrderSend, чтобы сделать код короче).

----GBPUSD---
точно такой же код, как и выше.

----USDJPY---
ТОЖЕ, ЧТО И ВЫШЕ

---USDCHF---
ТОЖЕ, ЧТО И ВЫШЕ

---AUDUSD---
ТАК ЖЕ, КАК И ВЫШЕ

**Специфика кода
одновременно могут заключаться сделки на покупку и короткие сделки по любой валюте, если соблюдены вышеуказанные критерии
*** Для этого кода не требуется стоплосс

**Нет кода управления капиталом для этого

Итак, как это выглядит?

 
niko:

Здравствуйте, легенды mql. Я приготовил для вас псевдокод во время обеденного перерыва на работе. Вот он. Дайте мне знать, чего не хватает, и я добавлю это.

Псевдокод N&P
В этой стратегии мы хотим иметь 1 код, иметь возможность прикрепить его к любому графику, и он будет работать на 5 валютах, входя в короткие и длинные позиции на каждой из них, если правила соответствуют.
---EURUSD---
Если ema7>ema14>sma50 и PriceNow < TopFilterLevel (например, 1.3080 для eurusd. Это я буду корректировать ежедневно), то:
Покупаем лоты EURUSD (лоты должны быть внешней переменной, например, 0.01). Иначе: (т.е. условия не выполнены) не покупать.

Если ema7<ema14<sma50 и PriceNow > BottomFilterLevel (например: 1.1508 для eurusd), то:
Короткие лоты EURUSD (опять же, внешняя переменная). Иначе (т.е. если условия не выполнены, не шортить).

Если позиция BUY достигает 20 пунктов от точки входа, то: TAKEPROFIT по EURUSD.
Если позиция SHORT достигает 20 пунктов от точки входа, то: TAKEPROFIT по EURUSD.
Если 20 пунктов не достигнуты (ни покупка, ни продажа), то продолжайте находиться в рынке до закрытия позиции.

вручную. (в идеале мы поместим это в функцию OrderSend, чтобы сделать код короче).

----GBPUSD---
точно такой же код, как и выше.

----USDJPY---
ТОЖЕ, ЧТО И ВЫШЕ

---USDCHF---
ТОЖЕ, ЧТО И ВЫШЕ

---AUDUSD---
ТАК ЖЕ, КАК И ВЫШЕ

**Специфика кода
одновременно могут заключаться сделки на покупку и короткие сделки по любой валюте, если соблюдены вышеуказанные критерии
*** для этого кода не требуется стоплосс

**Нет кода управления капиталом для этого

Итак, как это выглядит?

Привет, ребята, базовый учебник по кодированию действительно помог мне разобраться с этим (хотя подробной части кодирования не хватает). Чтобы показать вам, что я был занят, я приложил код ниже. Идея, я думаю, есть, но он все еще возвращает много ошибок. Вы увидите, что в Start() все заключено в одну большую скобку. Я сделал это потому, что mql продолжал возвращаться с ошибкой, что переменная не может быть объявлена глобально, и когда я заключил все в одну скобку, казалось, что эта ошибка исчезла (хотя многие другие ошибки сохранились). Я использовал Notepad++, чтобы проверить выравнивание скобок. Так я хотя бы иду правильным путем?

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
      int CalcOpenOrders()
         {
         int long=0,short=0;
      for(int i=0; i<OrdersTotal(); i++)   
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;
         //this function selects an order for further processing
         if(OrderType()==OP_BUY)long++;
         if(OrderType()==OP_SELL)short++;
         }
      if(long>0)return(long);
      if(short>0)return(-short);
      }

//------------ (fingers crossed this is right). I still don't get it why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
   {
   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(Bars<75)
      {
      Print("Bars less than 100");
      return(0);
      }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders();
  
   // Check output of function
   if ( ReturnVal >0)  // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok=1;
      else
      {
      eurusdbuyok=0;
      return(0);
      }

   if ( ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
      eurusdshortok=1;
      else
      {
      eurusdshortok=0;
      return(0);
      }


   //--------------condition ends

   if( eurusdshortok==1)
      {
      static int ticket;
      // deleted if(OrdersTotal()==0)
      if( e1under2 && e2under3)     // short function
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
            Print("SHORT order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok==1)
      {
      static int ticket1;
      // deleted if(OrdersTotal()==0)
      if( e1over2 && e2over3 && eurusdbuyok==1) //buy function
         {
         ticket1=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( ticket1>0)
            {
            if(OrderSelect( ticket1, SELECT_BY_TICKET, MODE_TRADES))
            Print("BUY order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }

   return(0);
   } 
это последняя версия кода. синтаксически все вроде бы в порядке, но когда я запускаю его через тестер стратегий, он не возвращает сделок. что-то не так с логикой. нужна помощь. Сейчас я начинаю разбираться в коде, в структуре программы.
 
niko wrote >>

Здравствуйте, легенды mql. Я приготовил для вас псевдокод во время обеденного перерыва на работе. Вот он. Дайте мне знать, чего не хватает, и я добавлю это.

Псевдокод N&P
В этой стратегии мы хотим иметь 1 код, иметь возможность прикрепить его к любому графику, и он будет работать на 5 валютах, входя в короткие и длинные позиции на каждой из них, если правила соответствуют.
---EURUSD---
Если ema7>ema14>sma50 и PriceNow < TopFilterLevel (например: 1.3080 для eurusd. Это я буду корректировать на ежедневной основе), то:
Покупаем лоты EURUSD (лоты должны быть внешней переменной, например, 0.01). Иначе: (т.е. условия не выполнены) не покупать.

Если ema7<ema14<sma50 и PriceNow > BottomFilterLevel (например: 1.1508 для eurusd), то:
Короткие лоты EURUSD (опять же, внешняя переменная). Иначе (т.е. если условия не выполнены, не шортить).

Если позиция BUY достигает 20 пунктов от точки входа, то: TAKEPROFIT по EURUSD.
Если позиция SHORT достигает 20 пунктов от точки входа, то: TAKEPROFIT по EURUSD.
Если 20 пунктов не достигнуты (ни покупка, ни продажа), то продолжайте находиться в рынке до закрытия позиции.

вручную. (в идеале мы поместим это в функцию OrderSend, чтобы сделать код короче).

----GBPUSD---
точно такой же код, как и выше.

----USDJPY---
ТОЖЕ, ЧТО И ВЫШЕ

---USDCHF---
ТОЖЕ, ЧТО И ВЫШЕ

---AUDUSD---
ТАК ЖЕ, КАК И ВЫШЕ

**Специфика кода
одновременно могут заключаться сделки на покупку и короткие сделки по любой валюте, если соблюдены вышеуказанные критерии
*** для этого кода не требуется стоплосс

**Нет кода управления капиталом для этого

Итак, как это выглядит?

Привет, Нико

Ваш псевдокод выглядит довольно хорошо для первой попытки.

Однако я хотел бы видеть его немного более структурированным, и есть пара вопросов, которые он вызывает у меня.

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

Обратите внимание, что на данном этапе мы не пишем на каком-либо конкретном компьютерном языке. Мы просто пытаемся четко и недвусмысленно указать, что мы пытаемся сделать.

Вы можете заметить, что псевдокод довольно специфичен и "юридичен". Именно так мы должны разговаривать с компьютерами. Мы должны очень четко сформулировать, что именно мы хотим, чтобы они сделали. В противном случае они склонны генерировать мусор.

Вы также заметите использование "блоков" для организации вещей в логические группы. Они могут пригодиться позже, чтобы помочь нам правильно структурировать код. Как кто-то отметил ранее в этом обсуждении, мы не делаем это просто так. Мы делаем это, чтобы сделать код более читабельным, более понятным, более удобным для сопровождения и, в конечном счете, более надежным и свободным от ошибок. Последнее чрезвычайно важно для программного обеспечения, которое будет использоваться для реальной торговли, если, конечно, у вас нет ведра денег, которые вы готовы выбросить на ветер :) . Серьезно, торговля и так достаточно сложна без необходимости иметь дело с глючным программным обеспечением.

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

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

Если вы еще не сделали этого, вы можете попробовать редактор Notepad++, который FXtrader2008 упоминал ранее в этом обсуждении. Используйте любые инструменты, которые вы можете найти, чтобы сделать жизнь немного проще. Пожалуйста, отправьте ваш пересмотренный псевдокод обратно мне в виде текстового файла. Я нахожу попытки написать структурированный код, псевдо или иначе, в этом HTML редакторе немного утомительными и беспорядочными.

С уважением,

Тим

Файлы:
 
TSWilson:

Привет, Нико

Ваш псевдокод выглядит довольно хорошо для первой попытки.

Однако я хотел бы видеть его более структурированным, и есть несколько вопросов, которые он вызывает у меня.

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

Обратите внимание, что на данном этапе мы не пишем на каком-либо конкретном компьютерном языке. Мы просто пытаемся четко и недвусмысленно указать, что мы пытаемся сделать.

Вы можете заметить, что псевдокод довольно специфичен и "юридичен". Именно так мы должны разговаривать с компьютерами. Мы должны очень четко сформулировать, что именно мы хотим, чтобы они сделали. В противном случае они склонны генерировать мусор.

Вы также заметите использование "блоков" для организации вещей в логические группы. Они могут пригодиться позже, чтобы помочь нам правильно структурировать код. Как кто-то отметил ранее в этом обсуждении, мы не делаем это просто так. Мы делаем это, чтобы сделать код более читабельным, более понятным, более удобным для сопровождения и, в конечном счете, более надежным и свободным от ошибок. Последнее чрезвычайно важно для программного обеспечения, которое будет использоваться для реальной торговли, если, конечно, у вас нет ведра денег, которые вы готовы выбросить на ветер :) . Серьезно, торговля и так достаточно сложна без необходимости иметь дело с глючным программным обеспечением.

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

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

Если вы еще не сделали этого, вы можете попробовать редактор Notepad++, который FXtrader2008 упоминал ранее в этом обсуждении. Используйте любые инструменты, которые вы можете найти, чтобы сделать жизнь немного проще. Пожалуйста, отправьте ваш пересмотренный псевдокод обратно мне в виде текстового файла. Я нахожу попытки написать структурированный код, псевдо или иначе, в этом HTML редакторе немного утомительными и беспорядочными.

С уважением,

Тим

Привет TSW. Спасибо за это. Я вижу, что вы потратили на это довольно много времени, поэтому я очень ценю это. Я прикрепил обновленный псевдокод, но если он не прикрепился, вот он ниже. Я пытался понять, что вы упустили, но не смог понять, что именно, несколько вещей я добавил, но это были просто уточнения.


Что мы будем делать дальше? В то время как мы создаем этот "правильный" код, я все еще пытаюсь разгадать загадку приведенного выше кода. Он не соответствует нашему псевдокоду, поскольку это старый исправленный код, но я все еще озадачен им, поскольку он должен работать, по крайней мере, для 1 валюты. Главное, что создание кода таким неорганизованным бессистемным способом учит меня фактическим элементам кодирования (например, как скобки влияют на скрипт, где объявлять переменные и т.д.). Есть идеи, почему этот код не работает в том виде, в котором он есть сейчас?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote >>

Привет, ребята, базовый учебник по кодированию действительно помог мне разобраться с этим (хотя подробной части кодирования не хватает). Чтобы показать вам, что я был занят, я приложил код ниже. Идея, как мне кажется, есть, но он все еще возвращает много ошибок. Вы увидите, что в Start() все заключено в одну большую скобку. Я сделал это потому, что mql продолжал возвращаться с ошибкой, что переменная не может быть объявлена глобально, и когда я заключил все в одну скобку, казалось, что эта ошибка исчезла (хотя многие другие ошибки сохранились). Я использовал Notepad++, чтобы проверить выравнивание скобок. Так я хотя бы иду правильным путем?

Это последняя версия кода. синтаксически все вроде бы в порядке, но когда я запускаю его через тестер стратегий, он не выдает сделок. что-то не так с логикой. нужна помощь. Я уже достаточно хорошо знаком с кодом, ну, со структурой программы.

Эй, ребята/девушки, любая помощь с приведенным выше фрагментом кода (не псевдокода, а кода), пока я учусь делать это правильно.

У меня сегодня был мозговой штурм, я думаю, может быть ошибка в том, что есть одна функция, считающая ордера, и вместо этого, возможно, мне нужно 2 функции отдельно, одна считает покупки, а другая продажи. Я запрограммировал код ниже (изменил несколько вещей, чтобы учесть это), вы можете видеть ниже. Но все равно все запуталось, так как я еще совсем новичок. Есть идеи по этому поводу?

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     if(long>0)return(long);
     if(short>0)return(-short);
     }

//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  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(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
        {
        ticket1=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(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
           Print("BUY order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }

  return(0);
  }

 
niko wrote >>

Привет ребята/девушки, любая помощь с приведенным выше кусочком кода (не псевдокода, а кода кода), пока я учусь делать это правильно.

У меня сегодня был мозговой штурм, я думаю, что возможно ошибка в том, что есть одна функция, считающая ордера, и вместо этого, возможно, мне нужно 2 функции отдельно, одна считает покупки, а другая продажи. Я запрограммировал код ниже (изменил несколько вещей, чтобы учесть это), вы можете видеть ниже. Но все равно все запуталось, так как я еще совсем новичок. Есть идеи по этому поводу?

Привет Нико

Со ссылкой на псевдокод

Из кода:
*** Вопрос ***
Какие периоды времени вы хотите использовать для скользящих средних? Являются ли эти периоды минутами, часами, днями, неделями, месяцами или они должны быть переменными?
***Ответ *** Отличный вопрос. Это будут 5-минутные периоды для всех скользящих средних, они не должны быть переменными.

Тогда я бы предложил добавить в псевдокод в области параметров конфигурации утверждение примерно следующего содержания

"Использовать 5-минутный таймфрейм для индикаторов".


Вы сказали:
***Я был неясен в этом вопросе, мои извинения. В коде не должно быть этого блока.

Я буду выходить из позиций вручную по мере необходимости через окно торговли/терминала

(я предполагаю, что это возможно и не испортит исполнение советника, верно).

Так что на самом деле я не знаю, нужно ли нам кодировать эту гибкость или нет? Что вы думаете?


Тогда я предлагаю вам просто удалить этот блок из псевдокода.

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

Вы добавили эти строки:

ELSE Если уже есть 1 открытая позиция на покупку для этой валютной пары НЕ ОТКРЫВАТЬ позицию на покупку для этой валютной пары.

ELSE Если по данной валютной паре уже открыта 1 позиция на продажу Не открывать позиции на продажу по данной валютной паре.


*** Вопрос *** Почему вам нужно специально указывать, что вы НЕ хотите, чтобы программа делала после того, как предыдущие строки просто

Укажите, что вы ДЕЙСТВИТЕЛЬНО хотите, чтобы делала программа. На мой взгляд, псевдокод - это то место, где нужно тщательно продумать свою логику. В противном случае вы, скорее всего

когда вы начинаете кодировать программу.


Вы сказали:
PS: Я часто использую только 1 направление на валютной паре (например: просто короткое, для eurusd на 2 дня, например). Как мы можем встроить это в код. Я предполагаю, что я могу просто поставить '//' перед частями кода, которые я не хочу использовать (например, перед ордерами на покупку или продажу в каждой валютной паре), а затем удалить их, когда мне понадобится использовать эту часть кода в следующий раз. Будет ли это работать с кодом, структурированным таким образом?


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

В течение определенного периода вы можете захотеть быть длинным EURUSD, коротким GBPUSD и вообще не торговать USDCHF. Этого довольно легко добиться, но я бы хотел, чтобы вы попробовали сами разобраться с тем, как описать это в псевдокоде.


Вот несколько подсказок относительно одного из возможных вариантов действий.

1. посмотрите, как настроены и используются ваши уровни

2. Уровни представлены в виде десятичных чисел. Для ситуаций "идти/не идти" принято использовать другой тип представления, известный как булево число или флаг. Можно ли использовать флаги для достижения того, что вы хотите сделать?


Вы сказали:

**Честно говоря, я не могу придумать, что вы забыли специально. Разве что проверить, достаточно ли средств для торговли, но это пока не нужно.

Может быть, в будущих версиях стратегии.


Нет, это не проверка достаточности средств. Вы конкретно сказали "никакого управления капиталом", за исключением, конечно, указания размера лота. Это нечто гораздо более фундаментальное.

Какие элементы информации вам нужны для размещения ордера? Где и как каждый из этих элементов описывается и обрабатывается в коде psuedo?


Вы сказали:

Куда нам двигаться дальше? Пока мы создаем этот "правильный" код, я все еще пытаюсь разгадать загадку приведенного выше кода. Он не соответствует нашему псевдокоду, так как это старый исправленный код, но я все еще озадачен этим, так как он должен работать, по крайней мере, для 1 валюты. Главное, что создание кода таким неорганизованным бессистемным способом учит меня фактическим элементам кодирования (например, как скобки влияют на скрипт, где объявлять переменные и т.д.). Есть идеи, почему этот код не работает в том виде, в котором он сейчас?


Я ценю ваше разочарование. Я очень быстро просмотрел старый код, но, честно говоря, то, что вы пытаетесь сделать, не имеет особого логического смысла. Я могу переписать этот кусок кода за 15 минут, и он будет делать то, что вы хотите, но дело не в этом, не так ли? Вы сказали, что хотите научиться писать код. Я пытаюсь научить вас делать это самостоятельно.


Нико, я не думаю, что вы слишком далеки от того, чтобы начать писать (новый) правильный код, но важно сначала получить как можно больше из того, "что вы хотите сделать", точно зафиксированное в псевдокоде.

Это сделает кодирование "намного проще", как вы скоро увидите.


Продолжайте в том же духе

Будь здоров

Тим

 

Привет, Тим,


Как всегда, я очень ценю то, что вы уделили мне время. Я продолжу и изменю псевдокод так, чтобы он отражал ваши комментарии. Насчет реального кода - не беспокойтесь, давайте сделаем все как надо (я просто иногда немного нетерпелив :), ведь обучение - это мощнее, чем что-либо другое.

 

Привет, Тим,


Я снова просмотрел псевдокод и сделал столько, сколько мой мозг новичка смог понять на данный момент. Пожалуйста, найдите его в приложении, я с нетерпением жду ваших комментариев!

Файлы:
 
niko wrote >>

Привет, Тим,

Я снова просмотрел псевдокод и сделал столько, сколько мой мозг новичка смог понять на данный момент. Пожалуйста, найдите его в приложении, я с нетерпением жду ваших комментариев!

Привет, Ник

Все выглядит хорошо.

Я просмотрел ваш последний псевдокод и ответил на некоторые вопросы и т.д.

Думаю, мы почти готовы приступить к кодированию.


В качестве очень грубого эмпирического правила говорят, что 1/3 времени программирования должна быть потрачена на спецификацию, 1/3 - на кодирование и 1/3 - на отладку и тестирование.


Таким образом, можно сказать, что сейчас мы прошли примерно 1/3 пути по этому небольшому проекту!

Теперь давайте поговорим о языке MT4.


Все компьютерные языки имеют определенные способы (формат), в которых язык должен быть написан, чтобы компьютер мог понять, что вы пытаетесь ему поручить. Об этом и другой специфической информации о языке вы узнаете из документации. Документация для MT4 доступна онлайн на этом форуме. Если вы еще не сделали этого, я бы посоветовал вам потратить некоторое время на изучение той информации, которая имеется в документации. Тогда, когда вам понадобится информация о какой-то конкретной теме или функции, вы будете знать, где ее искать.


Чтобы немного облегчить жизнь, многие современные компьютерные языки, включая MT4, используют шаблоны, которые устанавливают для вас базовую схему программы. Эти шаблонные программы часто называют "мастерами". Вы найдете мастера советника в пункте меню "Создать" в редакторе MetatEditor с зеленым крестиком на нем.


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

Вы должны будете дать каждому параметру имя, тип и начальное значение.


Названия параметров всегда должны описывать их суть


например, EURUSD_TopFilterLevel является осмысленным именем ex1 IS NOT. Использование осмысленных имен данных делает программу намного проще для понимания отладки или модификации в дальнейшем. Обратите внимание, что в MT4 имена данных чувствительны к регистру. LOTSize - это не то же самое, что LotSize. Вы должны быть внимательны и последовательны в именах данных.


Вам также потребуется указать тип данных (type) для каждого параметра. В MT4 используется всего 4 типа данных Integer Number (int), Decimal Number (double), Text (string) и True / False или Flag (bool).


И снова нам нужно быть осторожными с типами данных и не смешивать их неосознанно, иначе мы можем внести тонкие ошибки.


После создания шаблона с помощью мастера я бы предложил вам начать "структурировать" вашу программу. Основной структурной единицей в МТ4 является ФУНКЦИЯ.


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



void MyBasicFunction()

{

}


Шаблон, созданный мастером metatrader, уже содержит три пустые функции.



int init()

{

return(0)

}



init deinit()

{

return(0)

}



int start()

{

return(0)

}


Функция init вызывается каждый раз при запуске советника, когда вы перетаскиваете его на график и нажимаете кнопку включения советника.

Функция deinit вызывается каждый раз, когда советник останавливается, когда вы перетаскиваете его с графика или нажимаете кнопку советника OFF


Функция запустить вызывается при КАЖДОМ новом тике, получаемом графиком, к которому она прикреплена. Это означает, что она может вызываться несколько раз или более в минуту в зависимости от загруженности рынка. Именно здесь мы будем выполнять большую часть нашей работы.


На данный момент я предлагаю вам поместить весь псевдокод из основного блока в функцию start, а затем закомментировать псевдокод с помощью // в каждой строке.


Затем создайте новую функцию для блока правил входа и закомментируйте псевдокод в ней таким же образом.


Функции init и deint оставьте пока пустыми и такими, какие они есть.


Вы должны быть в состоянии скомпилировать этот код без ошибок, но, конечно, на данном этапе он ничего не сделает.


Продолжайте работать в том же духе!


С уважением,

Тим

(PS мы можем поговорить по skype, если нужно, но пока давайте посмотрим, как у нас пойдет с форумом)

Файлы:
 

Привет, Тим,

Как всегда, твоя помощь и время бесценны! В знак благодарности я хотел бы отправить тебе очень хорошую бутылку шампанского, как только мы закончим процесс кодирования.

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

Я начну процесс кодирования и сделаю блоки очень четкими и отдельными, чтобы помочь нам обоим понять, что происходит. И отправлю их вам через форум.

1 Вопрос: Вы сказали, что брокерские компании ввели меры по предотвращению агрессивного пипсовки. 1. Что вы понимаете под агрессивным пипсовкой? 2. Какие меры они предпринимают?

Раньше я вручную скальпировал eurusd на 1-минутных таймфреймах (с помощью метода спредбеттинга), все шло очень хорошо, пока брокерская компания не вмешалась и не начала вводить задержки на исполнение (вход и выход). Так что теперь нет никакого смысла делать это с этим брокером, даже если это незаконно, задержки все равно произойдут и испортят весь день (например, если вы обычно скальпируете только на 1 час, 2 задержки и вы потеряли драгоценное время). Мне вернули все деньги за задержанные сделки после агрессивных угроз обращения в суд.

2 Вопрос: Используете ли вы разных брокеров? Каких брокеров вы бы порекомендовали? (если вам разрешено упоминать имена здесь).

спасибо,

ник

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