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

star603

Новичок форума
Одновременное открытие сделок по разным валютам и закрытие по общему профиту.
Возможность этого не исключена. Изначально это не планировалась. Действия в основном будут посходить в пределах 1 валютной пары. А запущен будет на нескольких.
 

mobidik

-----
А если поставить в 2 окнах на разных парах по советнику,в которых уже есть встроенный тралл,то нужно ли в этих советниках писать разные магик номера,при условии что советники стоят на одном счёте?
И еще вопрос - если нужно закрыть все открытые ордера,то какой код даст быстрое по скорости закрытие,имеет ли значение как организовать цикл перебора ордеров от последнего или от первого или нет разницы,если можно приведите кусок кода?
ЗАРАНЕЕ СПАСИБО!
Если советники стоят на разных символах - тогда, как правило, можно ставить одинаковые меджики, т.е., в коде должна быть проверка на символ, что уже разделит проверку позиций. Соответственно, если работают два советника по одному и тому же символу - меджики ставить только разные.

Закрытие в цикле:
C-подобный:
for(int i=OrdersTotal()-1; i>=0; i--)
Но, тут важно организовать саму проверку по закрытию позиций: если не удалось закрыть - засчитать неудачу и по завершению работы цикла, если не удалось все закрыть - повторить процедуру закрытия. Т.е., предыдущий цикл должен быть внутри еще одного. Мне удобнее использовать внешний цикл с помощью оператора while(). При этом, если пошли на второй круг, сперва организовать не большую паузу. Если речь идет о закрытии, скажем, более 100 поз, паузу делаем минимальной или совсем отказываемся от нее.
 

mobidik

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

MakarFX

Элитный участник
Поправочка: это мультивалютник, а арбитраж подразумевает наличие "быстрого" и "медленного" брокеров: за одним наблюдаем, а по второму входим. Как правило, берем пару пипок и закрываемся, время жизни позиции до нескольких секунд.
Вы ошибаетесь. Арбитраж - это больше торговля коррелирующими парами -https://ru.wikipedia.org/wiki/Арбитраж_(экономика)
 
Последнее редактирование модератором:

mobidik

-----
Вы ошибаетесь. Арбитраж - это больше торговля коррелирующими парами
- "... на практике возникает разница цен" - можно и так, согласен. Но далеко не всегда торговля по разным парам основана на корреляции между ними.
 
Последнее редактирование модератором:

star603

Новичок форума
Код:
void OnTick()
  {
   TORGOVLAY();
   uy(MoyOrdera);
  }
  //############################################
  void uy(int &gh2[6])
  {
   gh2[0]=0;
   gh2[1]=0;
   gh2[2]=0;
   gh2[3]=0;
   gh2[4]=0;
   gh2[5]=0;
   for(int y=0; y<=OrdersTotal()-1; y++)
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)
        {
         if(OrderType()==OP_BUY)
           {
            gh2[0]++;
           };
         if(OrderType()==OP_SELL)
           {
            gh2[1]++;
           };
         if(OrderType()==OP_BUYSTOP)
           {
            gh2[2]++;
           };
         if(OrderType()==OP_SELLSTOP)
           {
            gh2[3]++;         
           };
         if(OrderType()==OP_BUYLIMIT)
           {
            gh2[4]++;
           };
         if(OrderType()==OP_SELLLIMIT)
           {
            gh2[5]++;
           };
        }
     }
  }

Что скажите о такой реализации?
 

Абдулхаким

Почетный гражданин
Что скажите о такой реализации?
для разнообразия эти строчки
Код:
         if(OrderType()==OP_BUY)
           {
            gh2[0]++;
           };
         if(OrderType()==OP_SELL)
           {
            gh2[1]++;
           };
         if(OrderType()==OP_BUYSTOP)
           {
            gh2[2]++;
           };
         if(OrderType()==OP_SELLSTOP)
           {
            gh2[3]++;         
           };
         if(OrderType()==OP_BUYLIMIT)
           {
            gh2[4]++;
           };
         if(OrderType()==OP_SELLLIMIT)
           {
            gh2[5]++;
           };
можно записать так :)
Код:
gh2[OrderType()]++;
 

Ugar

Гуру форума
Код:
void OnTick()
  {
   TORGOVLAY();
   uy(MoyOrdera);
  }
  //############################################
  void uy(int &gh2[6])
  {
   gh2[0]=0;
   gh2[1]=0;
   gh2[2]=0;
   gh2[3]=0;
   gh2[4]=0;
   gh2[5]=0;
   for(int y=0; y<=OrdersTotal()-1; y++)
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)
        {
         if(OrderType()==OP_BUY)
           {
            gh2[0]++;
           };
         if(OrderType()==OP_SELL)
           {
            gh2[1]++;
           };
         if(OrderType()==OP_BUYSTOP)
           {
            gh2[2]++;
           };
         if(OrderType()==OP_SELLSTOP)
           {
            gh2[3]++;        
           };
         if(OrderType()==OP_BUYLIMIT)
           {
            gh2[4]++;
           };
         if(OrderType()==OP_SELLLIMIT)
           {
            gh2[5]++;
           };
        }
     }
  }

Что скажите о такой реализации?
Чуть сократил.
Код:
void uy(int &gh2[6])
  {
   int type;
   ArrayInitialize(gh2,0);
   for(int y=0; y<OrdersTotal(); y++)
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)
        {
        type=OrderType();
        gh2[type]=gh2[type]+1;
        }
     }
  }
 

vladradon

Программист
можно записать так
Только нужно учесть размер массива, т.к. он может быть больше 6-ти:
КОНСТАНТАЗНАЧЕНИЕОПИСАНИЕ
OP_BUY0Ордер на покупку
OP_SELL1Ордер на продажу
OP_BUYLIMIT2Отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня
OP_BUYSTOP3Отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня
OP_SELLLIMIT4Отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня
OP_SELLSTOP5Отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня
OP_BALANCE6Пополнение или вывод со счёта
OP_CREDIT7Использование кредита
8Оплата брокером партнёрского вознаграждения рибейт-партнёрам, являющееся частью спреда с каждой сделки клиента
Но последние 3 значения не должны попадаться в списке текущих ордеров.
 
Последнее редактирование:

star603

Новичок форума
Только нужно учесть размер массива, т.к. он может быть больше 6-ти:
КОНСТАНТАЗНАЧЕНИЕОПИСАНИЕ
OP_BUY0Ордер на покупку
OP_SELL1Ордер на продажу
OP_BUYLIMIT2Отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня
OP_BUYSTOP3Отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня
OP_SELLLIMIT4Отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня
OP_SELLSTOP5Отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня
OP_BALANCE6Пополнение или вывод со счёта
OP_CREDIT7Использование кредита
8Оплата брокером партнёрского вознаграждения рибейт-партнёрам, являющееся частью спреда с каждой сделки клиента
Но последние 3 значения не должны попадаться в списке текущих ордеров.
Спасибо об этом не подозревал
 

Ugar

Гуру форума
Прокатывало с незапамятных времён. Как минимум 13 лет…
То же попробовал, работает. А я столько лет инкременты и декременты для массивов пишу по деревенски gh2[type]=gh2[type]+1;. Это столько букаф лишних наклацал.
 
Верх