Ваши вопросы по языку MQL4

Levis_Rock

Активный участник
Elvis Burunduk,
if (OrderMagicNumber() == магик именно от этой пары && (total==0))

Примерно так ?
 
Последнее редактирование:

eevviill2

Местный знаток
Так то понятно, как это записать?
На глобальном уровне
PHP:
extern int Magic = 4335; 
int buys_,sells_,buys_S,sells_S,buys_L,sells_L,Orders_Total;

Так где тебе нужно
PHP:
CountOpenedPositions_f();
if(Orders_Total==0)...

функция
PHP:
////////////////////////////////////////////////////////////////////////////////////
 void CountOpenedPositions_f()
 {
 buys_=0;
 sells_=0;
  buys_S=0;
 sells_S=0;
  buys_L=0;
 sells_L=0;
 Orders_Total=0;
int type=-1;

 for (int i=OrdersTotal()-1; i>=0; i--)
 {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
       
     type=OrderType();
    
   if(type==OP_BUY)      buys_++;
    else
   if(type==OP_SELL)     sells_++; 
    else
   if(type==OP_BUYSTOP)      buys_S++;
    else
   if(type==OP_SELLSTOP)     sells_S++; 
    else
   if(type==OP_BUYLIMIT)      buys_L++;
    else
   if(type==OP_SELLLIMIT)     sells_L++; 
 }

 Orders_Total=buys_+sells_+buys_S+sells_S+buys_L+sells_L;
 }
 

Elvis Burunduk

Элитный участник
Elvis Burunduk,
if (OrderMagicNumber() == магик именно от этой пары && (total==0))

Примерно так ?

Нет, не так,
Ты выложи сюда содержимое функции total() и мы поможем.
вот это надо засунуть внутрь.

if(OrderMagicNumber()!=магик этой пары || OrderSymbol()!=Symbol()) continue;
 
Последнее редактирование:

Levis_Rock

Активный участник
Elvis Burunduk,

PHP:
 if (Hour()>=2 && Hour()<3) return(0);
    if (Hour()>=5 && Hour()<8) return(0);
    if (Hour()>=10 && Hour()<12) return(0);
    if (Hour()>=14 && Hour()<15) return(0);
    if (Hour()>=16 && Hour()<17) return(0);
    if (Hour()>=18 && Hour()<21) return(0);



   if (total==0) // если нет позиций
     {
      // Buy
      if(Close[2]<BB_Up && Close[1]>BB_Up && MA_1_Long>MA_2_Long)
        {
        OrderSend(Symbol(),OP_BUY,Lots,Ask,50,BB_Low-reserve*Point,0,"Buy MIN RISK",86388,0,Green);
        return(0);
        }

И есть в закрытии ордеров
PHP:
   total=OrdersTotal();
   
   for(cnt=0;cnt<total;cnt++)
 

Levis_Rock

Активный участник
Вообщем нужно поменять OrdersTotal() на что то другое, т к ордер тотал берёт абсолютно все открытые ордера в терминале, не зависимо от чего либо. Может поменять на OrderCount например или что то ещё ?
 

Levis_Rock

Активный участник
Elvis Burunduk,
eevviill2,
Фффух, вроде всё получилось.. С кодом Дикого я так и не разобрался)
8 часов шуршания на различных форумах и вот что собрал:

Перед открытием позиций бай и селл :

PHP:
     {
      // Buy
//-----------------------------------------------------------------------------------
      for(int i = OrdersTotal()-1; i>=0; i--)
{
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
   {
      if(OrderType()<=1 && OrderSymbol() == "GBPJPY" && OrderMagicNumber() == 96388)
      return(0);
      {
   }
   }
   }
 //------------------------------------------------------------------------------------

И аналогично в селл только с переменной "i1".

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

Всем спасибо !:)
 

vladradon

Программист
total убрал, если символ и магик совпадает, то всё открывается как нужно, так же при тесте менял в коде пару и магик, и бот начинает открывать тысячи ордеров, значит всё должно быть в порядке.
Можно и не убирать было:
PHP:
 total=0;
  for(int i=0; i<OrdersTotal(); i++) 
     {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
		 if(OrderSymbol()==Symbol() &&
		    OrderMagicNumber()==Magic &&
		     (OrderType()== OP_BUY || OrderType()== OP_SELL))
	  total++;
     }
Только проверку на бай или селл можно и не делать, если других (отложенных) ордеров не предвидится. Ну а магик свой подставь вместо Magic.
 
Последнее редактирование:

Levis_Rock

Активный участник
Можно и не убирать было:
PHP:
 total=0;
  for(int i=0; i<OrdersTotal(); i++) 
     {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
		 if(OrderSymbol()==Symbol() &&
		    OrderMagicNumber()==Magic &&
		     (OrderType()== OP_BUY || OrderType()== OP_SELL))
	  total++;
     }
Только проверку на бай или селл можно и не делать, если других (отложенных) ордеров не предвидится. Ну а магик свой подставь вместо Magic.
Где же ты раньше был, дружище.
 

Elvis Burunduk

Элитный участник
Я не ожидал, что такой простой вопрос вызовет столько дискуссий...

Да я как бы тоже не ожидал,

Levis_Rock , немного не так надо было для бая,

if(OrderType()<=1 && OrderSymbol() == Symbol() && OrderMagicNumber() == 96388)
NULL можно вместо Symbol() применить.

А то задолбаешься вносить в каждую копию изменения, и как всегда где то забудешь сменить пару - будешь ломать голову. :D
 

vladradon

Программист
Перед открытием позиций бай и селл :
Кстати, этот вариант не совсем верный, т.к. если у тебя открытие ордеров происходит из основной функции типа OnTick(), команда return(0) перезапустит сова и все команды после команд открытия уже не отработают. Т.е. если есть ордер в рынке, перезапуск сова.
 

Levis_Rock

Активный участник
Кстати, этот вариант не совсем верный, т.к. если у тебя открытие ордеров происходит из основной функции типа OnTick(), команда return(0) перезапустит сова и все команды после команд открытия уже не отработают. Т.е. если есть ордер в рынке, перезапуск сова.

Перезапуск и подхватывает ордер по меджику, как то так, наверное) я не особо соображаю в этой теме.
Главное всё работает, совы открывают ордера, если открыты другие. И проверял на 8 терминалах сразу, где установлена сова на одну пару, всё точь в точь.
 
Последнее редактирование:

Levis_Rock

Активный участник
Да я как бы тоже не ожидал,

Levis_Rock , немного не так надо было для бая,

if(OrderType()<=1 && OrderSymbol() == Symbol() && OrderMagicNumber() == 96388)
NULL можно вместо Symbol() применить.

А то задолбаешься вносить в каждую копию изменения, и как всегда где то забудешь сменить пару - будешь ломать голову. :D
Да не, 5 минут копипаста:D
 
Верх