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

Charles

charles2_1_5.mq4

Похожие материалы по тегам

ares_indicator.pineTradingView · 1 общих теговgold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов! cycle-identifier.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 1 общих теговprecisionflowea.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Charles (версия 2.1.5) — это торговый советник для MetaTrader 4, предназначенный для автоматического управления ордерами на нескольких валютных парах одновременно. Советник анализирует ценовые данные с использованием набора технических индикаторов (RSI, EMA, ATR, Bollinger Bands, ADX) и уровней пивотов, а затем открывает рыночные и отложенные ордера на покупку и продажу.

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

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

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

НастройкаОписание
Comment_1 Текстовый комментарий с инструкцией по формату списка валютных пар через запятую.
Comment_1a Текстовый комментарий с указанием, что строка пар должна совпадать с строкой провайдера счёта.
Symbols Список валютных пар через запятую, по которым советник торгует. Если строка пуста, советник работает с текущим символом графика.
MagicNumber Магический номер ордеров, по которому советник идентифицирует управляемые позиции. Ордера с другим магическим номером игнорируются (если не включён AllOrders).
xFactor Множитель для расчёта хедж-лота при открытии противоположных позиций. Используется для корректировки размера лота при разнице между покупками и продажами.
TimeSet Время в формате ЧЧ:ММ, в которое происходит сбёт дневных уровней и удаление всех отложенных ордеров перед открытием новых.
Comment_2 Текстовый комментарий с пояснением о расчёте лота на основе процента баланса.
RiskPercent Процент риска от баланса, используемый для аварийной блокировки при достижении убытка. При убытке, превышающем заданный процент от баланса, срабатывает механизм блокировки.
Comment_3 Текстовый комментарий с пояснением о проценте риска для каждого лота.
Comment_3a Текстовый комментарий с указанием, что риск автоматически адаптируется под количество пар.
RiskPerTrade Процент риска на каждую сделку. При значении больше нуля используется для расчёта размера лота; при нуле — применяется фиксированный лот.
MaxAllowedOrders Максимальное общее количество одновременно открытых и отложенных ордеров по всем парам. Реальный лимит на одну пару рассчитывается как деление этого значения на количество пар.
MaxOpenHours Максимальное время удержания открытого ордера в часах. При превышении и отрицательной прибыли ордер закрывается.
ProfitCheckPeriod Период в минутах, используемый для проверки условий закрытия ордеров по прибыли на таймфрейме M15.
Comment_4 Текстовый комментарий с пояснением о режиме строгих уровней поддержки и сопротивления.
Aggressive При включении использует более строгие уровни поддержки и сопротивления для определения условий открытия ордеров. При выключении применяются стандартные уровни на более старых таймфреймах.
UsePivots При включении советник использует уровни пивотов и корректирует тейк-профит на основе уровней поддержки и сопротивления при движении против позиции.
Comment_5 Текстовый комментарий с пояснением об оставлении прибыльных ордеров открытыми.
FastPeriod Период быстрой скользящей средней EMA, используемой для определения тренда на таймфрейме M15.
SlowPeriod Период медленной скользящей средней EMA, используемой для определения тренда на таймфрейме M15.
Selectivity Период индикатора RSI, используемый для определения условий входа на таймфреймах M5 и M15.
Comment_6 Текстовый комментарий с пояснением о фиксированном значении лота при нулевом риске.
Lots Фиксированное значение лота, используемое при нулевом значении RiskPerTrade или RiskPercent.
Slippage Допустимое проскальзывание в пунктах при открытии и закрытии ордеров.
Comment_7 Текстовый комментарий с указанием, что параметр предназначен для ECN/STP-провайдеров, требующих добавления стопов после открытия ордера.
ECN Переключатель режима ECN/STP. При включении советник не устанавливает стоп-лосс и тейк-профит при открытии ордера, а добавляет их позже. При выключении — устанавливает их сразу.
MarginPercent Процент от баланса, используемый для проверки свободной маржи перед открытием ордера. Советник проверяет, что свободная маржа не ниже заданного процента от баланса.
Comment_8 Текстовый комментарий с пояснением об управлении всеми ордерами.
StopLoss Стоп-лосс в пунктах для открытых ордеров. При значении 0 стоп-лосс не устанавливается. При ECN=false задаётся сразу при открытии.
TrailStart Уровень в пунктах от цены открытия, начиная с которого активируется трейлинг-стоп для прибыльных ордеров.
TrailingAmount Шаг трейлинг-стопа в пунктах — расстояние от текущей цены, на котором корректируется стоп-лосс для фиксации прибыли.
TakeProfit Тейк-профит в пунктах для открытых ордеров. При значении 0 тейк-профит не устанавливается.
Comment_9 Текстовый комментарий с пояснением об управлении всеми открытыми ордерами, включая ручные.
AllOrders При включении советник управляет всеми открытыми ордерами, включая открытые вручную. При выключении — только ордерами с заданным магическим номером.
Comment_10 Текстовый комментарий с пояснением о расчёте прибыли по всем парам.
AllSymbols При включении расчёт прибыли и закрытие корзины ордеров выполняется по всем парам. При выключении — только по текущей символике.
Comment_11 Текстовый комментарий с пояснением о логировании.
LogToFile При включении логирование сообщений записывается в файл Charles-2.1.5.log. При выключении — вывод в консоль через Print.
Comment_12 Текстовый комментарий с пояснением об удалении ордеров при инициализации.
InitResetOrders При включении при инициализации советник удаляет все отложенные ордера (BUYSTOP, SELLSTOP, BUYLIMIT, SELLLIMIT) по текущей символике.
Comment_13 Текстовый комментарий с пояснением о управлении торговым временем.
StartHour Час начала торговой сессии (0–24). Ордера не открываются до этого часа.
EndHour Час окончания торговой сессии (0–24). Ордера не открываются после этого часа.
CloseAllNow При включении советник немедленно закрывает все открытые ордера и удаляет все отложенные ордера.
FridayCloseTime Время в пятницу, после которого все открытые ордера принудительно закрываются (в часах).
Получить полный код

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

#define VER "2.1.5"

#define DECIMAL_CONVERSION 10

extern string Comment_1           = " -- Comma separated list of Symbol Pairs: EURUSD,USDCHF";
extern string Comment_1a          = " --- must be equal to the string of your account provider.";
extern string Symbols             = "EURUSDm,EURGBPm,EURJPYm,CHFJPYm,GBPUSDm,GBPJPYm,GBPCHFm,GBPAUDm,USDCADm,USDCHFm,USDJPYm,AUDNZDm,AUDUSDm,NZDUSDm";

extern int    MagicNumber         = 3939;
extern double xFactor             = 1.8;
extern string TimeSet             = "07:32";

extern string Comment_2           = " -- Balance percentage order balance and Lot value";
extern double RiskPercent         = 5;

extern string Comment_3           = " -- Percentage of the risk for each Lot";
extern string Comment_3a          = " --- auto-adapted to number of pairs.";
extern double RiskPerTrade        = 10;
extern int    MaxAllowedOrders    = 15;
extern int    MaxOpenHours        = 0;
extern int    ProfitCheckPeriod   = 3;

extern string Comment_4           = " -- Whether or not use more strict supports and resistances";
extern bool   Aggressive          = false;
extern bool   UsePivots           = true;

extern string Comment_5           = " -- Whether or not leave open profitable orders";
extern int    FastPeriod          = 18;
extern int    SlowPeriod          = 60;
extern int    Selectivity         = 14;

extern string Comment_6           = " -- Fixed value if RiskPerTrade == 0";
extern double Lots                = 0.01;
extern int    Slippage            = 3;
extern string Comment_7           = " -- Set to true if broker is ECN/STP needing stops adding after order";
extern bool   ECN                 = true;
extern double MarginPercent       = 20;

extern string Comment_8           = " -- On all orders";
extern int    StopLoss            = 0;
extern int    TrailStart          = 30;
extern int    TrailingAmount      = 10;
extern int    TakeProfit          = 20;

extern string Comment_9           = " -- Whether or not manage ALL opened orders (manual too)";
extern bool   AllOrders           = true;

extern string Comment_10           = " -- Whether or not compute the Profit on ALL pairs";
extern bool   AllSymbols          = true;

extern string Comment_11          = " -- Log to console or to a file";
extern bool   LogToFile           = false;

extern string Comment_12          = " -- On init delete all pending orders";
extern bool   InitResetOrders     = true;

extern string Comment_13          = " -- Trading Time Management";
extern int    StartHour           = 0;
extern int    EndHour             = 24;
extern bool   CloseAllNow         = false;
extern int    FridayCloseTime     = 0;

int Anchor, PendingBuy, PendingSell, Buys, Sells, i, StopLevel, Spread;

int MaxOpenOrders;

double BuyLots, SellLots, PendingBuyLots, PendingSellLots;
double Amount, Profit, LastProfit, Up, Dw, SL, TP;
double LotsValue, LotsHedgeValue;
double MaxPrice,MinPrice,MaxOpenPrice,MinOpenPrice;

bool isInGain=false, blockConditionHit=false, unlockOrdersPlaced=false; 
int LastOrderTicket, UnlockingOrderTicket, Result, Error;
int Delta;        //Order price shift (in points) from High/Low price
int LastDay;

double stopLoss, delta;
double trailStart, trailAmount, takeProfit;

double lastBarTime,lastpM5BarTime,lastpM15BarTime,lastpH1BarTime;

string SymbolsArray[0], CurrentSymbol;
bool canSell[0], canBuy[0], bullish[0], bearish[0];

bool Inited[0], DayStart[0], inited=false;

bool tradingAllowed=false;

double    Pivot[0];
double  Resist1[0];
double  Resist2[0];
double  Resist3[0];
double Support1[0];
double Support2[0];
double Support3[0];
double   pPoint[0];
bool     isCals[0];
double r1[0] , s1[0] ,s2[0], r2[0], r3[0], s3[0];

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

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

int CheckForClose(int s)
{
   RefreshRates();
   Count();

   int ordersTotal=OrdersTotal();
   bool skipBasket=false;

   if(ordersTotal>0)
   {
      if(Profit>=0)
      {
         skipBasket=true;
      }

      if(skipBasket==false)
      {
         double ordersWinningBasket[],ordersWinningBasketTkts[],ordersLosingBasket[],ordersLosingBasketTkts[],ordersBasketHedgeTkts[];
         ArrayResize(ordersWinningBasket,ordersTotal);
         ArrayResize(ordersWinningBasketTkts,ordersTotal);
         ArrayResize(ordersLosingBasket,ordersTotal);
         ArrayResize(ordersLosingBasketTkts,ordersTotal);
         ArrayResize(ordersBasketHedgeTkts,ordersTotal);

         int winners=0,loosers=0;

         for(i=0; i<ordersTotal; i++)
         {
            ordersWinningBasket[i]=0;
            ordersWinningBasketTkts[i]=0;
            ordersLosingBasket[i]=0;
            ordersLosingBasketTkts[i]=0;
            ordersBasketHedgeTkts[i]=0;

             if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
             {

               if(AllSymbols==false && OrderSymbol()!=CurrentSymbol)
               {
                  continue;
               }//if

               if(AllOrders==false && OrderMagicNumber()!=MagicNumber)
               {
                  continue;
               }//if

               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
               {
                  if(OrderProfit()+OrderSwap()+OrderCommission()>0)
                  {
                     ordersWinningBasket[winners]     =  OrderProfit()+OrderSwap()+OrderCommission();
                     ordersWinningBasketTkts[winners] =  OrderTicket();
                     winners++;
                  } 
                  else if(OrderProfit()+OrderSwap()+OrderCommission()<0)
                  {
                     ordersLosingBasket[loosers]     =  OrderProfit()+OrderSwap()+OrderCommission();
                     ordersLosingBasketTkts[loosers] =  OrderTicket();
                     loosers++;
                  }
               }
            }
         }//for

         Log( "[Basket] - Winners#"+winners+"; Loosers#"+loosers );

         for(int w=0;w<winners;w++)
         {
            if( OrderSelect(ordersWinningBasketTkts[w],SELECT_BY_TICKET,MODE_TRADES) )
            {
               Log( "[Basket] - Checking Order#"+OrderTicket()+"; ["+OrderSymbol()+"]#"+(OrderProfit()+OrderCommission()+OrderSwap()) );
               for(int l=0;l<loosers;l++)
               {
                  if( OrderSelect(ordersLosingBasketTkts[l],SELECT_BY_TICKET,MODE_TRADES) && MathAbs(ordersLosingBasket[l])<ordersWinningBasket[w] )
                  {

                     int sum=loosers;
                     while(sum>0)
                     {
                        for(int ls=0;ls<sum;ls++)
                        {
                           ordersBasketHedgeTkts[0]=ordersLosingBasketTkts[l];
                           double hedgeProfit=ordersLosingBasket[l];
                           int hedgePos=1;
                           for(int lsp=0;lsp<sum;lsp++)
                           {
                              if( ordersLosingBasketTkts[lsp] != ordersLosingBasketTkts[l] && MathAbs(ordersLosingBasket[lsp])<ordersWinningBasket[w] )
                              {
                                 ordersBasketHedgeTkts[hedgePos]=ordersLosingBasketTkts[lsp];
                                 hedgeProfit+=ordersLosingBasket[lsp];
                                 hedgePos++;
                              }//if
                           }//for
                        }//for

                        if(hedgePos>1)
                           Log( "[Basket - STEP 1."+ls+"] - hedgePos#"+hedgePos+"; hedgeProfit#"+MathAbs(hedgeProfit*xFactor)+"; ordersWinningBasket#"+ordersWinningBasket[w] );

                        if(hedgePos>1 && (MathAbs(hedgeProfit*xFactor)<ordersWinningBasket[w]) )
                        {
                           Log("[BASKET] hedgePos#"+hedgePos+"; hedgeProfit#"+MathAbs(ordersLosingBasket[l])+"; ordersWinningBasket#"+ordersWinningBasket[w]);
                           for(int oh=0; oh<hedgePos; oh++)
                           {
                              if(OrderSelect(ordersBasketHedgeTkts[oh],SELECT_BY_TICKET,MODE_TRADES))
                              {

                                 while (!IsTradeAllowed()) Sleep(100);
                                 RefreshRates();

                                 Log("[BASKET] - Closing Order#"+OrderTicket()+"; ["+OrderSymbol()+"]");

                                 if(OrderType()==OP_BUY)
                                 {
                                    OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slippage, Blue);
                                 }
                                 else if(OrderType()==OP_SELL)
                                 {
                                    OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), Slippage, Red);
                                 }
                              }
                           }

                           if(OrderSelect(ordersWinningBasketTkts[w],SELECT_BY_TICKET,MODE_TRADES))
                           {

                              while (!IsTradeAllowed()) Sleep(100);
                              RefreshRates();

                              Log("[BASKET] - Closing Order#"+OrderTicket()+"; ["+OrderSymbol()+"]");

                              if(OrderType()==OP_BUY)
                              {
                                 OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slippage, Blue);
                              }
                              else if(OrderType()==OP_SELL)
                              {
                                 OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), Slippage, Red);
                              }
                           }
                           sum=0;
                           loosers=0;
                           winners=0;
                           break;
                        }

                        sum--;
                     }//while
                  }               
               }
            }
         }

      }
   }

   RefreshRates();      
   Count();

   int sx;   
   if(Profit>=0 && Profit>=Amount)
   {
      ordersTotal=OrdersTotal();

      double gainingProfit=0,loosingProfit=0;
      if(ordersTotal>0)
      {
         for(i=ordersTotal-1; i>=0; i--)
         {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
            {
               if( (OrderProfit()+OrderSwap()+OrderCommission())>0 )
               {
                  gainingProfit+=(OrderProfit()+OrderSwap()+OrderCommission());
               }
               else
               {
                  loosingProfit+=(OrderProfit()+OrderSwap()+OrderCommission());
               }
            }
         }
      }

      if(loosingProfit==0 || gainingProfit>(MathAbs(loosingProfit)) )
      {
         isInGain=true;
      }
      else
      {
         isInGain=false;
      }

      RefreshRates();      
      Count();

      if( isInGain==false && Profit<=(LastProfit - Amount/10) )
      {
         isInGain = false;
         blockConditionHit=false;
         unlockOrdersPlaced=false;
         LastOrderTicket = -1;
         UnlockingOrderTicket = -1;
         LastProfit=0;

         for(sx=0; sx<ArraySize(canSell); sx++)
         {
            canSell[sx] = true;
            canBuy[sx] = true;
            CloseAll(sx, isInGain);
         }
      }

      if(isInGain==true )
      {
         ordersTotal=OrdersTotal();

         if(ordersTotal>0)
         {
            for(i=ordersTotal-1; i>=0; i--)
            {
               double highest=0;
               double lowest=0;
               double chgFromOpen=0,chgFromPeak=0,chgFromLown=0;
               double ceil=0,floor=0;
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
               {

                  if (MarketInfo(OrderSymbol(), MODE_DIGITS) == 3 || MarketInfo(OrderSymbol(), MODE_DIGITS) == 5)   {
                     floor    = NormalizeDouble(Delta * DECIMAL_CONVERSION * MarketInfo(OrderSymbol(), MODE_POINT),MarketInfo(OrderSymbol(), MODE_DIGITS));
                     ceil     = NormalizeDouble(TakeProfit * DECIMAL_CONVERSION * MarketInfo(OrderSymbol(), MODE_POINT),MarketInfo(OrderSymbol(), MODE_DIGITS));
                  }
                  else
                  {
                     floor    = NormalizeDouble(Delta * MarketInfo(OrderSymbol(), MODE_POINT),MarketInfo(OrderSymbol(), MODE_DIGITS));
                     ceil     = NormalizeDouble(TakeProfit * MarketInfo(OrderSymbol(), MODE_POINT),MarketInfo(OrderSymbol(), MODE_DIGITS));
                  }

                  highest = iHigh(OrderSymbol(),PERIOD_M15,iHighest(CurrentSymbol,PERIOD_M15,MODE_HIGH,ProfitCheckPeriod,1));
                  lowest  = iLow(OrderSymbol(),PERIOD_M15,iLowest(CurrentSymbol,PERIOD_M15,MODE_LOW,ProfitCheckPeriod,1));

                  if( OrderType() == OP_BUY  )
                  {
                     chgFromOpen = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - OrderOpenPrice(), MarketInfo(OrderSymbol(),MODE_DIGITS));
                     chgFromPeak = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - highest, MarketInfo(OrderSymbol(),MODE_DIGITS));
                     chgFromLown = NormalizeDouble(lowest - MarketInfo(OrderSymbol(),MODE_ASK), MarketInfo(OrderSymbol(),MODE_DIGITS));

                     if( (TimeCurrent()-OrderOpenTime())/60>=ProfitCheckPeriod*PERIOD_M15 && 
                           OrderProfit()+OrderCommission()+OrderSwap()>0 &&
                            chgFromOpen>0 && 
                              MathAbs(chgFromOpen-chgFromPeak)>=floor && MathAbs(chgFromOpen-chgFromPeak)<=ceil &&
                               chgFromLown<0 && MathAbs(chgFromLown)>=floor)
                     {
                        for(sx=0; sx<ArraySize(canSell); sx++)
                        {
                           canSell[sx] = true;
                           canBuy[sx] = true;
                           CloseAll(sx);
                        }
                        break;
                     }
                  }
                  else if( OrderType() == OP_SELL  )
                  {
                     chgFromOpen = NormalizeDouble(OrderOpenPrice() - MarketInfo(OrderSymbol(),MODE_ASK), MarketInfo(OrderSymbol(),MODE_DIGITS));
                     chgFromPeak = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - highest, MarketInfo(OrderSymbol(),MODE_DIGITS));
                     chgFromLown = NormalizeDouble(lowest - MarketInfo(OrderSymbol(),MODE_ASK), MarketInfo(OrderSymbol(),MODE_DIGITS));

                     if( (TimeCurrent()-OrderOpenTime())/60>

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

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

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

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

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

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

Стоимость полного кода
4 616,50₽ ≈ $56.42