Примеры: Учёт ордеров в большой программе

 

New article Учёт ордеров в большой программе has been published:

Рассматриваются общие принципы построения учёта ордеров в сложной программе.

Author: Сергей Ковалев

 

А как посчитать сколько лотов в сумме окрыто по Buy или Sell.
Спасибо.

 
Я ответил здесь 'Как посчитать сколько открыто Buy или Sell и в сумме у каждого лот?'

В целом подобные вычисления можно оформить в виде функции и вставить её в start() после функции Terminal().
 
А не могли бы полностью составить программу.?
Много чего не сходиться и пишет ошибку - чегото нет.
Тема очень интересная.
 
Merin095:
А не могли бы полностью составить программу.?
Много чего не сходиться и пишет ошибку - чегото нет.
Тема очень интересная.

Можно составить программу и полностью. Но в данном случае я не ставил перед собой такой цели.
И программы-то разные.. Я использую представленную здесь функцию в своих программах. Один из вариантов применения представлен здесь: Графический эксперт AutoGraf . Но это очень большая программа, вряд ли Вам нужно в ней разбираться.

Вы можете открыть на форуме MQL4 тему и выложить туда свой код. Посмотрим что не работает.
 
"но и показывает ущербность и ограниченность такой идеологии. "
сами Вы ущербные
научитесь в начале ручками "играть", а лишь потом пишите свои граали.

"Вот у меня не получается играть на форексе,  а я возьму и напишу ТС каторая это будет делать за меня"
это же идиотизм, полный....!
 
Как я понял из учебника, массив как переменная может быть или double, или int, или bool, или string. И соответственно в одном массиве используются значения одного типа. А из этой статьи я не понимаю, как тут в одном массиве собраны значения разных типов (целые и дробные). Как заносятся в массив с дробными числами следующие значения: OrderTicket(), OrderLots(),OrderType(),OrderMagicNumber()?
 
bearden:
"но и показывает ущербность и ограниченность такой идеологии. "
сами Вы ущербные
научитесь в начале ручками "играть", а лишь потом пишите свои граали.

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


Нет, вы не правы.

Во-первых, потому, что выбрали недостойный тон.

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

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

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

 

Опечатка вместо:

[][6] тип ордера 1=B,2=S,3=BL,4=SL,5=BS,6=SS

надо читать: [][6] тип ордера 0=B, 1=S, 2=BL, 3=SL, 4=BS, 5=SS

Проверяем так: Comment (OP_BUY," ",OP_SELL," ",OP_BUYLIMIT," ",OP_SELLLIMIT," ",OP_BUYSTOP," ",OP_SELLSTOP);

Либо в коде

Mas_Ord_Tek[ind][k][6] = OrderType(); 
Надо
Mas_Ord_Tek[ind][k][6] = OrderType()+1; 
 

Добрый день. Использовал ваш код в советнике но никак не могу реализовать запись массива на диск и его чтение. Может подскажите что делаю не так?

//+------------------------------------------------------------------+
int init()
    {
      FilesOpen(); // Читаем Файл в массив -->-Massiv
      return(0);
     }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int deinit()  
  {
      FilesWrite(); //  //  Пишем массив Massiv --> в Файл        
 return(0);  
  }
//+------------------------------------------------------------------+
//........
//+------------------------------------------------------------------+
void FilesOpen()   // Читаем Файл в Massiv -->-- (резервное копирование)
  {
   int h=FileOpen("Massiv.bin",FILE_BIN|FILE_READ);
  if(h<1)
    {
     Print("Файл Massiv.bin не обнаружен, последняя ошибка ", GetLastError());
     return(false);
    }
   int s=FileReadInteger(h,LONG_VALUE);
   ArrayResize(Massiv,s);
   FileReadArray(h,Massiv,0,s);
   FileClose(h);   
   }  
//+------------------------------------------------------------------+
void FilesWrite()   //  Пишем  Massiv --> в Файл (резервное копирование)
  {
   int h=FileOpen("Massiv.bin",FILE_BIN|FILE_WRITE);
   FileWriteInteger(h,ArraySize(Massiv),LONG_VALUE);
   FileWriteArray(h,Massiv,0,ArraySize(Massiv));
   FileClose(h);
  }  
 

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

Лично я использую следующую конструкцию сразу после обнуления переменных при инициализации start():

//---- Пересчет и ведение открытых ордеров   
for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderType()==OP_BUY && OrderSymbol()==_Symbol){//Есть открытый BUY
         if (условие закрытия ордера) {                 //если выполняется условие для закрытия, например, достигнут нужный уровень
            CloseOrder(OrderTicket());                  //вызываем функцию закрытия
            oBuy--;}                                    //раз ордер закрыт, то его из общего числа вычитаем
         oBuy++;}                                       //суммируем ордера нужного типа
      if(OrderType()==OP_SELL && OrderSymbol()==_Symbol){
         if (условие закрытия ордера) {
            CloseOrder(OrderTicket());
            oSell--;}
            }
         oSell++;}
}

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

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