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

alpha trader.mq5

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

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

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

О программе

Данный продукт представляет собой торгового советника для платформы MetaTrader 5, предназначенного для автоматической торговли на рынке XAUUSD. Советник использует две ONNX-модели машинного обучения для генерации торговых сигналов: основная модель формирует сигналы на вход, а мета-модель выступает фильтром для тайминга позиций. Сигналы сравниваются с настраиваемыми пороговыми значениями для принятия решения об открытии или закрытии позиций.

Советник поддерживает как покупку, так и продажу, с возможностью включения и отключения каждого направления отдельно. Доступен режим сеточной торговли с ограничением на количество позиций, заданной дистанцией между ними и временной задержкой между входами. Все ордера фильтруются по максимально допустимому спреду.

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

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

Настройки программы

НастройкаОписание
@LifeInDreamsWorld (Allow_Buy) Разрешить покупки — Разрешает открытие покупок. При значении false советник не открывает позиции на покупку.
Allow SELL signals (Allow_Sell) Разрешить продажи — Разрешает открытие продаж. При значении false советник не открывает позиции на продажу.
Close orders by signals (Only SL/TP if false) (close_orders_by_signals) Закрывать ордера по сигналам — При значении true позиции закрываются по сигналам модели. При значении false закрытие происходит только по стоп-лоссу и тейк-профиту.
Fixed lot (ManualLot) Ручной лот — Фиксированный размер лота. Если значение не равно нулю, используется вместо автоматического расчёта размера позиции.
Orders magic (OrderMagic) Магический номер ордера — Магический номер ордеров, используемый для идентификации позиций, открытых советником.
Max positions number (Enable grid mode if >1) (max_orders) Максимальное количество позиций — Максимальное количество одновременных позиций. При значении больше одного активируется режим сеточной торговли.
Time delay between positions (For grid mode) (orders_time_delay) Задержка между позициями — Временная задержка в секундах между открытиями позиций в сеточном режиме.
Distance between positions (For grid mode) (orders_distance) Расстояние между позициями — Расстояние между позициями в сеточном режиме, измеряемое в пунктах.
Max spread (max_spread) Максимальный спред — Максимально допустимый спред в пунктах. Советник не открывает позиции при превышении этого значения.
Stop loss (stoploss) Стоп-лосс — Стоп-лосс для позиций, задаваемый в пунктах.
Take profit (takeprofit) Тейк-профит — Тейк-профит для позиций, задаваемый в пунктах.
Bot comment (bot_comment) Комментарий бота — Комментарий, добавляемый к каждому ордеру, открытому советником.
Получить полный код

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

#include <Mean reversion/XAUUSD_H1 ONNX include 0.mqh>
#include <Trade\Trade.mqh>
#include <Trade\AccountInfo.mqh>

CTrade mytrade;
CPositionInfo myposition;

input group "Signals settings";
input bool Allow_Buy = true;           //@LifeInDreamsWorld
input bool Allow_Sell = true;          //Allow SELL signals
double main_threshold = 0.5;           //SIGNALS SENSITIVITY for buy and sell
double meta_threshold = 0.5;           //FILTER SENSITIVITY for positions timing
input bool close_orders_by_signals = true; // Close orders by signals (Only SL/TP if false)
input group "Positions settings"
double   MaximumRisk=0.00001;          //Progressive lot coefficient
sinput double   ManualLot=0.01;        //Fixed lot
sinput ulong    OrderMagic = 6374889475647; //Orders magic
input group "Money management settings"
input int max_orders = 3;              //Max positions number (Enable grid mode if >1)
input int orders_time_delay = 3;       //Time delay between positions (For grid mode)
input double orders_distance = 250;    //Distance between positions (For grid mode)
input int max_spread = 250;            //Max spread
input int stoploss = 5000;             //Stop loss
input int takeprofit = 5000;           //Take profit
input string bot_comment = "Alpha trader"; //Bot comment

static datetime last_time = 0;
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)

#define model ExtModel_XAUUSD_H1_0
#define model_m ExtModel2_XAUUSD_H1_0
#define periods PeriodsXAUUSD_H1_0
#define periods_m Periods_mXAUUSD_H1_0
#define fill_arrays fill_araysXAUUSD_H1_0
#define fill_arrays_m fill_arays_mXAUUSD_H1_0

const ulong  ExtInputShape [] = {1, ArraySize(periods)};
const ulong  ExtInputShape2 [] = {1, ArraySize(periods_m)};
long     ExtHandle = INVALID_HANDLE, ExtHandle2 = INVALID_HANDLE;

int OnInit()
  {
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
  {

   OnnxRelease(ExtHandle);
   OnnxRelease(ExtHandle2);
  }

void OnTick()
  {
      // код доступен только после оплаты
   }
   if(!isNewBar())
      return;

   double features[], features_m[];
   fill_arrays(features);
   fill_arrays_m(features_m);

   double f[ArraySize(periods)], f_m[ArraySize(periods_m)];

   for(int i = 0; i < ArraySize(periods); i++)
     {
      f[i] = features[i];
     }

   for(int i = 0; i < ArraySize(periods_m); i++)
     {
      f_m[i] = features_m[i];
     }

   static vector out(1), out_meta(1);

   struct output
     {
      long           label[];
      float          proba[];
     };

   output out2[], out2_meta[];

   OnnxRun(ExtHandle, ONNX_USE_CPU_ONLY, f, out, out2);
   OnnxRun(ExtHandle2, ONNX_USE_CPU_ONLY, f_m, out_meta, out2_meta);

   double sig = out2[0].proba[1];
   double meta_sig = out2_meta[0].proba[1];

   if(close_orders_by_signals && (Ask-Bid < max_spread*_Point))
      if(countOrders(OrderMagic) > 0)
         for(int b = PositionsTotal() - 1; b >= 0; b--)
            if(PositionGetSymbol(b)==_Symbol)
              {

               if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY &&
                  PositionGetInteger(POSITION_MAGIC) == OrderMagic &&
                  sig > main_threshold)
                  if(SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL) <
                     MathAbs(Bid - PositionGetDouble(POSITION_PRICE_OPEN)))
                    {
                     int res = -1;
                     do
                       {
                        res = mytrade.PositionClose(_Symbol);
                        Sleep(50);
                       }
                     while(res == -1);
                    }

               if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL &&
                  PositionGetInteger(POSITION_MAGIC) == OrderMagic &&
                  sig < 1-main_threshold)
                  if(SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL) <
                     MathAbs(Bid - PositionGetDouble(POSITION_PRICE_OPEN)))
                    {
                     int res = -1;
                     do
                       {
                        res = mytrade.PositionClose(_Symbol);
                        Sleep(50);
                       }
                     while(res == -1);
                    }
              }

   if((Ask-Bid < max_spread*_Point) && meta_sig > meta_threshold &&
      AllowTrade(OrderMagic))
      if(countOrders(OrderMagic) < max_orders &&
         CheckMoneyForTrade(_Symbol, LotsOptimized(), ORDER_TYPE_BUY))
        {
         double l = LotsOptimized();
         if(sig < 1-main_threshold && Allow_Buy && (getLastOpenedPrice(OrderMagic,POSITION_TYPE_BUY) == 0.0 ||
         Ask <= getLastOpenedPrice(OrderMagic,POSITION_TYPE_BUY) - orders_distance*Point()) )
           {
            int res = -1;
            do
              {
               double stop = Bid - stoploss * _Point;
               double take = Ask + takeprofit * _Point;
               res = mytrade.PositionOpen(_Symbol, ORDER_TYPE_BUY, l, Ask, stop, take, bot_comment);
               Sleep(50);
              }
  

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

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

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

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

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

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

Стоимость полного кода
863,50₽ ≈ $10.55