Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MetaQuotes Software Corp.
Модератор
185952
MetaQuotes Software Corp.  

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

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

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

MQL4 Comments
16319
MQL4 Comments  

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

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

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

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

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

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

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


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

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

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

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

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

Serg16
30
Serg16  

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

[][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; 
Evgeniy Zykov
786
Evgeniy Zykov  

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

//+------------------------------------------------------------------+
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);
  }  
Dmitriy Falkov
3348
Dmitriy Falkov  

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

Лично я использую следующую конструкцию сразу после обнуления переменных при инициализации 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++;}
}

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий