Нужна помощь

 

Проблема в следующем
В языке практически не разбираюсь, возникла необходимость автоматизировать открытие ордеров по нескольким вп, набросал вот такой простенький код (файл прилагаю), но получился какой то он корявый, 
По плану должен открывать 6 вп, а открывает только 3 вп, но иногда открывает и все 6 ,но потом опять перестает работать как надо (, думаю возможно это связано с количеством знаков после запятой цены, т.к. в блоке где нет JPY всё работает нормально.
Помогите пожалуйста решить эту проблему.
Да и еще, если не трудно подскажите как прописать, чтобы можно было переключать открывание сделок только Бай или Селл.

файл: ОПАСНЫЙ ФАЙЛ УДАЛЁН

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Информация об инструменте - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Sergey Korsunov:

Проблема в следующем
В языке практически не разбираюсь, возникла необходимость автоматизировать открытие ордеров по нескольким вп, набросал вот такой простенький код (файл прилагаю), но получился какой то он корявый, 
По плану должен открывать 6 вп, а открывает только 3 вп, но иногда открывает и все 6 ,но потом опять перестает работать как надо (, думаю возможно это связано с количеством знаков после запятой цены, т.к. в блоке где нет JPY всё работает нормально.
Помогите пожалуйста решить эту проблему.
Да и еще, если не трудно подскажите как прописать, чтобы можно было переключать открывание сделок только Бай или Селл.

файл: ОПАСНЫЙ ФАЙЛ УДАЛЁН

Файл нужно прикреплять при помощи кнопки  Прикрепить файл

 
ок
Файлы:
Test_3.mq4  7 kb
 
Sergey Korsunov:

Проблема в следующем
В языке практически не разбираюсь, возникла необходимость автоматизировать открытие ордеров по нескольким вп, набросал вот такой простенький код (файл прилагаю), но получился какой то он корявый, 
По плану должен открывать 6 вп, а открывает только 3 вп, но иногда открывает и все 6 ,но потом опять перестает работать как надо (, думаю возможно это связано с количеством знаков после запятой цены, т.к. в блоке где нет JPY всё работает нормально.
Помогите пожалуйста решить эту проблему.
Да и еще, если не трудно подскажите как прописать, чтобы можно было переключать открывание сделок только Бай или Селл.

Существует ряд причин, которые препятствуют открытию ордера. Предположим, на первом тике открылось 3 ордера

На следующем тике в самом начале программы   if(OrdersTotal() >= OrderCount)   return; произойдет возврат, т.к. количество ордеров больше OrderCount, который = 1.

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

Судя вот по этим строкам:

//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"

программу разработала фирма  MetaQuotes Software Corp.  Обратитесь к ним за консультацией!

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
a007 #:

Существует ряд причин, которые препятствуют открытию ордера. Предположим, на первом тике открылось 3 ордера

На следующем тике в самом начале программы   if(OrdersTotal() >= OrderCount)   return; произойдет возврат, т.к. количество ордеров больше OrderCount, который = 1.

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

Судя вот по этим строкам:

программу разработала фирма  MetaQuotes Software Corp.  Обратитесь к ним за консультацией!

имеется ввиду, что лишние ордера открываются?

 
Fast235 #:

имеется ввиду, что лишние ордера открываются?

нет, наоборот, нужно 6 разных валютных пар, а открывает только 3

и кстати, там где нет вп с йеной, открываются все 6 и основные и кроссы, там где есть вп с йеной, только 3
вот такая беда

 
Sergey Korsunov #:

нет, наоборот, нужно 6 разных валютных пар, а открывает только 3

самое простое ставьте Sleep() после открытия каждого ордера, терминал не успевает обновить кол-во(в угоду производительности видимо)

 
Fast235 #:

самое простое ставьте Sleep() после открытия каждого ордера, терминал не успевает обновить кол-во 

я практически не разбираюсь в языке (
написал код чисто на примерах в сети
Помогите вставить Sleep() в мой код

 
Sergey Korsunov #:

я практически не разбираюсь в языке (
написал код чисто на примерах в сети
Помогите вставить Sleep() в мой код

после OrderSend и ставьте Sleep(50); 

если не поможет 50 увеличить до 100-200

 
Fast235 #:

после OrderSend и ставьте Sleep(50); 

если не поможет 50 увеличить до 100-200

не помогло ((

 
Sergey Korsunov #:

не помогло ((

Попробуйте так - Короче и точнее. Если самостоятельно разберетесь в ней - будете корифеем программирования. Ставьте курсор на слово и нажимайте F1

//+------------------------------------------------------------------+
//|                                                       Test 3.mq4 |
//+------------------------------------------------------------------+
#property strict

extern double Lot   = 0.01;
extern int    Slip  = 3;
extern int    Magic = 777;

string name[10]={"AUDJPY","CHFJPY","CADJPY","AUDCAD","AUDCHF","CADCHF"};
int    cnt[6];

void OnTick()
{
   ArrayInitialize(cnt, 0); // Обнуление счетчиков

   // Подсчет ордеров по каждому торговому инструменту
   for(int n=OrdersTotal()-1; n>=0; n--)
   {
     if(!OrderSelect(n,SELECT_BY_POS))continue;
     for(int k=0; k<6; k++) if(OrderSymbol()==name[k]) cnt[k]++;
   }

   // Открытие ордеров по каждому торговому инструменту
   for(int k=0; k<6; k++) if(!cnt[k]) int ticket = OrderSend(name[k],OP_BUY, Lot, MarketInfo(name[k],MODE_ASK), Slip, 0, 0, "", Magic);
}
Причина обращения: