[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 287

 
Ну что я смогу посмотреть правильный код?
 
sergeev:
на первом не бай ордере вы засыпете счет Бай ордерами.


Спасибо! Нашел еще одну ошибку!

//+------------------------------------------------------------------+
//|                                                      OnlyBuy.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double lots=0.1;
extern int SlipPage=3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (OrdersTotal()==0)
   OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
  for (int j = 0; j < OrdersTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() != OP_BUY)
       OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
     }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
icas:


Спасибо! Нашел еще одну ошибку!


угу.

но предыдущую не исправили.

вам нельзя вставлять открытие ордера сразу в цикл. Вы сначала должны сделать полный цикл по ордерами и точно выяснить есть ли Бай или его нет.

И только после этого ставить Бай, после этого цикла.

 
sergeev:

угу.

но предыдущую не исправили.

вам нельзя вставлять открытие ордра сразу в цикл. Вы сначала должны сделать полный цикл по ордерами и точно выяснить есть ли Бай или Нет.

И только после этого ставить Бай, если его нет еще.



Правильно, просто я взял кусок из своей программы пости без переделки. Сейчас сделаю - 5 минут...
 
Но и этот код не правильный! Он будет открывать ордер на покупку только если нет никаких других ордеров не по какому др. фин. инструменту, а если есть любой другой, то не откроет покупку.
 
icas:

Правильно, просто я взял кусок из своей программы пости без переделки. Сейчас сделаю - 5 минут...
//+------------------------------------------------------------------+
//|                                                      OnlyBuy.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double lots=0.1;
extern int SlipPage=3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  for (int j = 0; j < OrdersTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() == OP_BUY) return(0);
     }
   }
  OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
  Sleep(10000); //Пауза 10 сек. для исполнениея ордера
//----
   return(0);
  }
//+------------------------------------------------------------------+
Сейчас правильно?
 
icas:
Сейчас правильно?
Sleep(10000); //Пауза 10 сек. для исполнениея ордера

А зачем нужна эта пауза?
 
kolyango:

А зачем нужна эта пауза?

Ордер исполняется не моментально. Без паузы на следующем тике ордер может быть еще не открыт, и программа пошлет еще раз команду на открытие. В МТ5-м в тестере уже можно ввести задержки исполнения.
 
icas:
Сейчас правильно?

А не пробовали сделать отдельной функцией поиск наличия/отсутствия позиций?

Например:

bool ExistPositions(int mn, string sy="", int op=-1) {
   if (sy=="") sy=Symbol();
   for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;
         if (op<0 || OrderType()==op)  
            return(True);
         }
      }
   return(False);
}

Magic - магическое число советника (задаётся в настройках, либо генерируется советником автоматически). Тогда для проверки отсутствия позиции Бай по текущему символу нужно написать:

if (!ExistPositions(Magic, Symbol(), OP_BUY)) {
   // ... Тут код для вызова функции открытия позиций ... 
   }

Заметьте - не просто команда на открытие ордера Бай, а полноценная функция с обработкой всех параметров открытия ордера и ошибок, возвращаемых сервером.

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

 
artmedia70:

А не пробовали сделать отдельной функцией поиск наличия/отсутствия позиций?

Например:

Тогда для проверки отсутствия позиции Бай по текущему символу нужно написать:

Заметьте - не просто команда на открытие ордера Бай, а полноценная функция с обработкой всех параметров открытия ордера и ошибок, возвращаемых сервером.

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



Первом посте я дал функции, kolyango это не устроило. Да еще, с магиками работать не люблю.