← К каталогу
Исходный код · ID 2982

mainfunc.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный исходный код представляет собой библиотеку на языке MQL для торгового советника, работающего с внешним источником торговых сигналов. Библиотека подключается к внешнему модулю через динамическую библиотеку и получает из него сигналы для последующей обработки. В коде определена структура для хранения торгового сигнала, содержащая идентификатор, время, код сигнала и имя символа.

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

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

Состав библиотеки

Классов: 1 · методов: 0 · конструкторов: 1 · деструкторов: 0 · отдельных функций: 23

Классы
Класс class STradeSignal

Структура данных для хранения одного торгового сигнала: идентификатор, время, код сигнала и имя символа.

Функции
Функция _tSizeT RunConnect(int, char& host[], char& user[], char& pw[], char& db[])

Устанавливает соединение с внешним источником сигналов через динамическую библиотеку, принимая параметры подключения.

Функция uint MakeSignals(_tSizeT work, STradeSignal& buff[], uint size)

Извлекает очередную порцию торговых сигналов из внешнего источника в переданный массив.

Функция void Disconnect(_tSizeT work)

Завершает соединение с внешним источником сигналов.

Функция int OnInit()

Инициализация советника: подготовка списка сигналов и тикеров, запуск таймера и начальная проверка параметров.

Функция void OnDeinit(const int reason)

Завершение работы советника: остановка таймера, освобождение ресурсов и отключение от источника сигналов в зависимости от причины.

Функция void OnTimer()

Периодический обработчик таймера, выполняющий контроль времени торговли, контроль эквити и управление торговлей.

Функция void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)

Обработчик событий графика, реагирующий на нажатия кнопок запуска и остановки торговой сессии.

Функция ENUM_INIT_RETCODE Start(bool is_new_param)

Запуск советника: проверка параметров, сброс дневной статистики и подготовка торговли к работе.

Функция ENUM_INIT_RETCODE CheckParam()

Проверка корректности входных параметров советника и вывод предупреждений при ошибках.

Функция void DayEquitySet()

Настройка дневного контроля эквити в соответствии с выбранным типом контроля.

Функция void TimeControl()

Контроль торгового времени: определение начала нового дня и управление доступностью торговли.

Функция void EquityControl()

Контроль эквити: отслеживание достижения порогов прибыли, убытка и трейлинг-остановки.

Функция bool EquityTralControl(double fEquity)

Трейлинг-контроль эквити: проверка условий активации и срабатывания трейлинг-остановки.

Функция void TradeControl()

Управление торговлей: закрытие позиций при запрете торговли и передача сигналов торговому модулю.

Функция bool CheckRestartCount()

Проверка возможности перезапуска торговой сессии с учётом лимита перезапусков и текущего состояния.

Функция void ResetSession()

Сброс параметров торговой сессии: обновление значений эквити, баланса и порогов контроля.

Функция void ResetDay()

Сброс дневной статистики: сброс сессии и дневного контроля эквити.

Функция void ResetDayControl()

Сброс дневного контроля эквити с учётом выбранного типа контроля.

Функция string GetStopReason()

Формирование текстового описания причины остановки торговли.

Функция void CheckSignalsList()

Разбор строки со списком сигналов и заполнение внутреннего массива допустимых сигналов.

Функция void CheckTickersList()

Разбор строки со списком тикеров и заполнение внутреннего массива.

Функция void Fogot(T &array[],int id,int &f_quant)

Удаление элемента из массива по индексу со сдвигом оставшихся элементов.

Функция int FogotRate(T &array[],T rate)

Удаление первого вхождения заданного значения из массива и возврат нового размера массива.

Методы и конструкторы
Конструктор · STradeSignal STradeSignal()

Конструктор структуры торгового сигнала, создающий пустой экземпляр.

Получить полный код

Поиск по коду файла

??//+------------------------------------------------------------------+

//|                                                      ProjectName |

//|                                      Copyright 2018, CompanyName |

//|                                       http://www.companyname.net |

//+------------------------------------------------------------------+

#include "Lib\Define\MQLDefine.mqh"





struct STradeSignal

  {

   long              id;

   datetime          time;

   int               signal;

   char              symbol[32-sizeof(long)-sizeof(datetime)-sizeof(int)];

                     STradeSignal()

     {

      //ZeroMemory(this);

     }

  };



#import "DBSignalsConnector.dll"

_tSizeT RunConnect(int, char& host[], char& user[], char& pw[], char& db[]);

uint MakeSignals(_tSizeT work, STradeSignal& buff[], uint size);

void Disconnect(_tSizeT work);

#import

//   uint RunConnect(int) {return 1;}

// uint MakeSignals(uint work, STradeSignal& buff[], uint size) {return 0;}

//void Disconnect(uint work) {}

//#import



#include "Header.mqh"



//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

int OnInit()

  {

   if(is_close_button)

      if(is_day_ban)

         button=new CButton(_START_BUTTON);

      else

         button=new CButton(_CLOSE_BUTTON);

   CheckSignalsList();

   string tmp=eTickersList;

   StringToUpper(tmp);

   StringSplit(tmp,',',gTickersList);

   EventSetMillisecondTimer(_TIMER);

   ENUM_INIT_RETCODE ret=Start();

   DLOG("Init result: ",ret);

   return(ret);

  }

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

   DLOG(__FUNCTION__);

   switch(reason)

     {

      case REASON_PARAMETERS:

         Start(true);

         delete gTimeControl;

         break;

      case REASON_PROGRAM:

      case REASON_REMOVE:

      case REASON_RECOMPILE:

      case REASON_CHARTCLOSE:

      case REASON_ACCOUNT:

      case REASON_INITFAILED:

      case REASON_CLOSE:

         gTrade.Disconnect();

         delete gTimeControl;

         delete gDayEquity;

      case REASON_TEMPLATE:

      case REASON_CHARTCHANGE:

         break;

     }

   EventKillTimer();

   delete button;

  }

//-------------------------------------------------------------------

void OnTimer()

  {

   TimeControl();

   EquityControl();

   TradeControl();

  }

//--------------------------------------------------------------------

void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)

  {

   if(id==CHARTEVENT_OBJECT_CLICK)

      if(sparam==_CLOSE_BUTTON)

        {

         if(!is_day_ban)

            Comment(_BUTTON_STOP);

         is_day_ban=true;

         gIsManualStop=true;

         gTrade.CloseAll();

         delete button;

         button=new CButton(_START_BUTTON);

        }

      else

         if(sparam==_START_BUTTON)

           {

            if(!gIsTradeAlloed)

              {

               button.SetPress(false);

               return;

              }

            if(gIsEquityUpBan&&

               MessageBox("Last trade is finished by profit equity stop\nDo you want to start new trading session?",NULL,MB_YESNO)==IDNO)

               return;

            if(gIsEquityDownBan&&

               MessageBox("Last trade is finished by loss equity stop\nDo you want to start new trading session?",NULL,MB_YESNO)==IDNO)

               return;

            if(gIsEquityTralStop&&

               MessageBox("Last trade is finished by equity traling stop\nDo you want to start new trading session?",NULL,MB_YESNO)==IDNO)

               return;

            is_day_ban=gIsEquityUpBan=gIsEquityDownBan=gIsEquityTralStop=false;

            gEquity=AccountEquity();

            gIsManualStop=false;

            ++gRestartCount;

            delete button;

            button=new CButton(_CLOSE_BUTTON);

            Comment(_ALLOWED_TEXT);

           }

  }

//+------------------------------------------------------------------+

ENUM_INIT_RETCODE Start(bool is_new_param=false)

  {

   ENUM_INIT_RETCODE res;

   static bool is_start=true,

               is_param=false;

   if(is_new_param)

     {

      is_param=true;

      return(INIT_SUCCEEDED);

     }

   if(!is_start&&!is_param)

      return(INIT_SUCCEEDED);

   res=CheckParam();

   if(is_param)

     {

      is_param=false;

      return(res);

     }

   if(res==INIT_SUCCEEDED)

     {

      ResetDay();

      Comment(_ALLOWED_TEXT);

      gTrade.FindOrders();

      is_start=false;

     }

   return(res);

  }

//--------------------------------------------------------------------

ENUM_INIT_RETCODE CheckParam()

  {

   ENUM_INIT_RETCODE res=INIT_SUCCEEDED;

   gTimeControl=is_time_work?new CTradeTimeControl(time_start,time_end,time_close):new CTradeTimeControl();

   DayEquitySet();

   if(is_main_be&&main_be_trigger<=0)

     {

      Alert("525@=K9 C@>25=L 2:;NG5=8O 157C1KB:0 >A=>2=>3> >@45@0, 4>;65= 1KBL 1>;LH5 0");

      res=INIT_PARAMETERS_INCORRECT;

     }

   if(is_lock&&is_lock_be&&lock_be_trigger<=0)

     {

      Alert("525@=K9 C@>25=L 2:;NG5=8O 157C1KB:0 ;>:8@CNI59 ?>78F88, 4>;65= 1KBL 1>;LH5 0");

      res=INIT_PARAMETERS_INCORRECT;

     }

   if(is_main_tral&&main_tral<=0)

     {

      Alert("525@=K9 C@>25=L B@0;0 >A=>2=>3> >@45@0, 4>;65= 1KBL 1>;LH5 0");

      res=INIT_PARAMETERS_INCORRECT;

     }

   if(is_lock&&is_lock_tral&&lock_tral<=0)

     {

      Alert("525@=K9 C@>25=L B@0;0 ;>:8@CNI59 ?>78F88, 4>;65= 1KBL 1>;LH5 0");

      res=INIT_PARAMETERS_INCORRECT;

     }

   if(ePrefix!=""&&StringFind(_Symbol,ePrefix)!=0)

     {

      Alert("525@=K9 ?@5D8:A A8<2>;0");

      res=INIT_PARAMETERS_INCORRECT;

     }

   if(eSuffix!=""&&StringSubstr(_Symbol,StringFind(_Symbol,eSuffix))!=eSuffix)

     {

      Alert("525@=K9 ACDD8:A A8<2>;0");

      res=INIT_PARAMETERS_INCORRECT;

     }

   if(!gTimeControl.IsTrueFormat())

     {

      Alert("525@=K9 D>@<0B 2@5<5=8");

      res=INIT_PARAMETERS_INCORRECT;

     }

   return(res);

  }

//--------------------------------------------------------------------

void DayEquitySet()

  {

   if(eDayEquityTralType==PROFIT_TYPE_NONE)

      delete gDayEquity;

   else

      if(!CheckPointer(gDayEquity))

         gDayEquity=new CEquityControl(eDayEquityTralType==PROFIT_TYPE_CURRENCY?TRAL_TYPE_CURRENCY:TRAL_TYPE_PERCENT);

      else

         gDayEquity.SetNewParam(eDayEquityTralType==PROFIT_TYPE_CURRENCY?TRAL_TYPE_CURRENCY:TRAL_TYPE_PERCENT);

  }

//-----------------------

Показано первые 50% кода (символов: 23597)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 359,70₽ ≈ $28.84