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

CITY-ScalperX2 EA

city-scalperx2 ea.mq4
Вы автор или правообладатель?

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

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

О программе

CITY-ScalperX2 EA — торговый советник для платформы MetaTrader 4, предназначенный для автоматической торговли на основе анализа ценовых паттернов. Советник считывает исторические данные из файлов HST (таймфрейм H4) и определяет паттерны pinbar на текущих свечках для принятия торговых решений.

При обнаружении бычьего или медвежьего pinbarа и выполнения условий по индикаторам WPR и AO, советник открывает ордера BUY или SELL с заданными параметрами стоп-лосса и тейк-профита. Доступен режим торговли по сигналам (Trade_BySignal), при котором ордера открываются только при наличии сигнала, а также обычный режим торговли без сигнальной фильтрации.

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

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

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

НастройкаОписание
Pairs Торговые пары — Список торговых пар через пробел, на которых работает советник.
RunEAonTimeframe Таймфрейм работы — Настройка таймфреймов работы советника в формате, например, M1! > M5! > M15!.
SettingOrderMode Режим ордера — Настройка режима работы ордеров. Определяет условия для управления множественными ордерами.
Trade_BySignal Торговля по сигналу — Режим торговли по сигналу. При значении ON ордера открываются только при наличии сигнала pinbar. При OFF — ордера открываются на каждом подходящем сигнале без ограничений.
Order Distance (Order_Distance) Расстояние ордера (пипсы) — Расстояние в пипсах между ордерами при усреднении позиций. Определяет минимальное отклонение цены от средней для открытия нового ордера.
LotMultiply Множитель лота — Множитель размера лота при усреднении позиций. Определяет, во сколько раз новый ордер будет больше предыдущего.
Close_BySignal Закрытие по сигналу — Переключатель автоматического закрытия позиций по сигналу pinbar. При включении советник закрываетbuy-позицию при медвежьем pinbarе и sell-позицию при бычьем pinbarе.
MagicID Идентификатор магии — Идентификатор магии (magic number) для маркировки ордеров, открытых советником. Позволяет отличить его ордера от ордеров других советников.
LOTS Фиксированный лот — Фиксированный размер лота для открытия ордеров. Используется, когда параметр risk установлен в 0.
risk: 0-->fixed lots (risk) Риск (процент баланса) — Процент риска от баланса для расчёта размера лота. При значении 0 используется фиксированный лот (LOTS). Формула: баланс * risk% / 10000.
Max Order (Max_Order) Максимум ордеров — Максимальное количество ордеров, которые советник может открыть одновременно на текущем символе.
Stoploss (SL_Pip) Стоп-лосс (пипсы) — Размер стоп-лосса в пипсах для открытых ордеров.
Take Profit (TP_Pip) Тейк-профит (пипсы) — Размер тейк-профита в пипсах для открытых ордеров.
Take Profit With Line (TPLinier) Линейный тейк-профит — Переключатель линейного тейк-профита. При включении тейк-профит рассчитывается от средней цены открытых позиций.
UseTralling (UseTralling_Stop) Трейлинг-стоп — Переключатель трейлинг-стопа. При включении советник автоматически перемещает стоп-лосс вверх при достижении определённой прибыли.
Ts Start in Pips (TrallingStart) Начало трейлинга (пипсы) — Расстояние в пипсах от открытия ордера, после которого активируется трейлинг-стоп.
Lock Profit in Pips (LockProfit) Фиксация прибыли (пипсы) — Уровень фиксации прибыли в пипсах. Совместно с TrallingStart определяет точку, до которой перемещается стоп-лосс при достижении определённой прибыли.
TimeFilter (UseTimeFilter) Фильтр времени — Переключатель фильтра времени торговли. При включении советник работает только в заданном временном интервале между Start и End1.
Start (Start) Время начала — Время начала торговой сессии в формате ЧЧ:ММ. Используется совместно с параметром End1 для фильтрации времени торговли.
Stop (End1) Время окончания — Время окончания торговой сессии в формате ЧЧ:ММ. Используется совместно с параметром Start для фильтрации времени торговли.
Ordercomment Комментарий ордера — Текстовый комментарий, который присваивается каждому ордеру, открытому советником. Отображается в истории торгов.
Получить полный код

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

#property description   "Creat Ea By: Citytrader"
#property description   "Contact Ea Owner Telegram ID: Ceo_CityTrader"
#property description   ""
#property description   "Join in Telegram Group : "

int acc_number=0;

bool use_demo=True;
int demo_year=2100;
int demo_month=05;
int demo_day=31;

#include <stderror.mqh>
#include <stdlib.mqh>

#import   "kernel32.dll"
int CreateFileW(string Filename,int AccessMode,int ShareMode,int PassAsZero,int CreationMode,int FlagsAndAttributes,int AlsoPassAsZero);
int GetFileSize(int FileHandle,int PassAsZero);
int SetFilePointer(int FileHandle,int Distance,int &PassAsZero[],int FromPosition);
int ReadFile(int FileHandle,uchar &BufferPtr[],int BufferLength,int  &BytesRead[],int PassAsZero);
int CloseHandle(int FileHandle);
#import

int Slippage=3;

int    Retries=10;

bool   AutoTrade=true;

bool   ecnBroker=false;

enum OPBySignal
{
ON=0,
OFF=1,
};
extern string Pairs = "EURUSD GBPUSD GBPJPY";
extern string RunEAonTimeframe = "M1! > M5! > M15!";  
extern string SettingOrderMode = "Only > 1 Order Trade Set:On&True";
extern  OPBySignal Trade_BySignal = OFF; 
extern  int        Order_Distance = 50; //Order Distance
extern  double    LotMultiply  = 1;
extern  bool      Close_BySignal = False;
extern  int      MagicID=12345678;
input  double   LOTS=0.01;
input  int      risk=100;//risk: 0-->fixed lots

input  int      Max_Order =15; // Max Order
input  double   SL_Pip=500; // Stoploss
input  double   TP_Pip=150; // Take Profit
extern bool     TPLinier = true; // Take Profit With Line
extern bool     UseTralling_Stop   = True; // UseTralling
extern double   TrallingStart = 15;    // Ts Start in Pips
extern double   LockProfit    = 10;     // Lock Profit in Pips
extern bool   UseTimeFilter   = false;  // TimeFilter
extern string Start           = "00:00";// Start
extern string End1            = "15:00";// Stop
extern string Ordercomment="CITY-ScalperX2";

bool jamOP(){
bool Oc=false;
   if(UseTimeFilter){
      string j1 = TimeToStr(TimeCurrent(), TIME_DATE) + " " + Start;
      string j2 = TimeToStr(TimeCurrent(), TIME_DATE) + " " + End1;
      if(TimeCurrent()>=StrToTime(j1)&&TimeCurrent()<StrToTime(j2)){return(true);}
   }else {return(true);}
   return(Oc);
}
union Price
  {
   uchar             buffer[8];
   double            close;
  };

double data[][2];

int BytesToRead;
string    datapath;
string    result;
Price     m_price;
int StopLoss  = 0;
double    SL_BEP_minus = 0;
double g_Point;
int    ticket=0;
double    Buy, lotbuy, lotsbuy, Sell, lotsell, lotssell, SUM, SWAP, 
          profitbuy, profitsell, OP, dg,
          sumbuy, sumsell, bepbuy, bepsell, lowlotbuy, lowlotsell, hisell, 
          lobuy;

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

void OnDeinit(const int reason)
  {
    ObjectDelete("L01"); 
    ObjectDelete("L02"); 
    ObjectDelete("L03");
    ObjectDelete("L04");  
    ObjectDelete("L05"); 
    ObjectDelete("L06"); 
    ObjectDelete("L07"); 
    ObjectDelete("L08"); 
    ObjectDelete("L09"); 
    ObjectDelete("L10");
    ObjectDelete("L11");
    ObjectDelete("L12");
    ObjectDelete("L13"); 
    ObjectDelete("L14"); 
    ObjectDelete("L15");
    ObjectDelete("L16"); 
    ObjectDelete("L17"); 
    ObjectDelete("L18");
    ObjectDelete("L19"); 
    ObjectDelete("L20"); 
    ObjectDelete("L21");
    ObjectDelete("L22");  
    ObjectDelete("L23");
    ObjectDelete("L24");
    ObjectDelete("L25");
    ObjectDelete("L26");  
    ObjectDelete("L27");
    ObjectDelete("L28");
    ObjectDelete("L29"); 
    ObjectDelete("L30"); 
    ObjectDelete("L31"); 
    ObjectDelete("L32"); 
    ObjectDelete("L33");
    ObjectDelete("L34"); 
    ObjectDelete("L35"); 
    ObjectDelete("L36");
    ObjectDelete("L37");  
    ObjectDelete("L38");
    ObjectDelete("L39");
    ObjectDelete("L40");
    ObjectDelete("L41");  
    ObjectDelete("L42"); 
    ObjectDelete("L43"); 
    ObjectDelete("L44");
    ObjectDelete("L45");  
    ObjectDelete("L46");
    ObjectDelete("L47");
    ObjectDelete("L48");
    ObjectDelete("L49");  
    ObjectDelete("L50"); 
    ObjectDelete("L51");
    ObjectDelete("L52");
    ObjectDelete("L53");  
    ObjectDelete("L54"); 
    ObjectDelete("L55"); 
    ObjectDelete("L56");
    ObjectDelete("L57");  
    ObjectDelete("L58");
    ObjectDelete("L59");
    ObjectDelete("L60");
    ObjectDelete("L61");  
    ObjectDelete("L62");  
    ObjectDelete("L63"); 

   ObjectDelete("Average_Price_Line_Bep");
   ObjectDelete("Average_Price_Line_Buy");
   ObjectDelete("Average_Price_Line_Sell");
   ObjectDelete("Information_");
   ObjectDelete("Average_Price_Buy");
   ObjectDelete("Average_Price_Sell");
   ObjectDelete("MENU");
   ObjectDelete("MENU1");
   ObjectsDeleteAll();
   ObjectsDeleteAll();
   ObjectsDeleteAll();
   ChartRedraw();
  }

void OnTick()
  {
      // код доступен только после оплаты
   }
  int xx=0;

int CountTrades(){
    int count=0;
    for(int trade=OrdersTotal()-1;trade>=0;trade--){
    int resulttrade=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicID)continue;
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicID){
      if(OrderType()==OP_SELL || OrderType()==OP_BUY){count++;}}}
 return(count);}

int CountTradesBuy(){
    int count=0;
    for(int trade=OrdersTotal()-1;trade>=0;trade--){
    int resulttradebuy=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicID)continue;
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicID){
      if(OrderType()==OP_BUY){count++;}}}
 return(count);}

int CountTradesSell(){
    int count=0;
    for(int trade=OrdersTotal()-1;trade>=0;trade--){
    int resulttradesell=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicID)continue;
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicID){
      if(OrderType()==OP_SELL ){count++;}}}
 return(count);} 

void myAvg(){
         int      iCount      =  0;
         double   LastOP      =  0;
         double   LastLots    =  0;
         bool     LastIsBuy   =  false;
         int      iTotalBuy   =  0;
         int      iTotalSell  =  0;         

         double   Spread      = 0.0;   
         Spread= MarketInfo(Symbol(), MODE_SPREAD); 

   int pos = -1 ;
   for(int i = 0 ; i < BytesToRead - 1 ; i++)
     {
      if(!(data[i][0]<Time[0]))
         break;
      pos = i + 1;
     }

         for(iCount=0;iCount<OrdersTotal();iCount++){                  
           bool iCount2=false;
        iCount2=OrderSelect(iCount,SELECT_BY_POS,MODE_TRADES);         
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicID)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP>OrderOpenPrice()) {LastOP=OrderOpenPrice();}
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=true;
               iTotalBuy++;
             }

           if(OrderType()==OP_SELL && OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicID)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP<OrderOpenPrice()) {LastOP=OrderOpenPrice();}         
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=false;
               iTotalSell++;
            }         
         }      

         /* Jika arah Price adalah DOWNTREND...., Periksa nilai Bid (*/
         if(LastIsBuy)
         {
         if(data[pos][1]>Open[0])
         {
            if(IsBuyPinbar() && Bid<=LastOP-(Order_Distance*Point )){
               ticket=OrderSend(Symbol(),OP_BUY,NormalizeDouble((LastLots* LotMultiply  ),2),Ask,Slippage,0,0,Ordercomment,MagicID,0,clrGreen);
                bool LiB2=false;
        LiB2=OrderModify(ticket,OrderOpenPrice(),Ask-SL_Pip*g_Point,Ask+(TP_Pip*g_Point),0,clrGreen);   
               LastIsBuy=false;
               return;
            }
         }
         }
         /* Jika arah Price adalah Sell...., Periksa nilai Ask (*/
         else if(!LastIsBuy)
         {
         if(data[pos][1]<Open[0] )
         { 
            if(IsSellPinbar() && Ask>=LastOP+(Order_Distance*Point )){
             ticket =OrderSend(Symbol(),OP_SELL,NormalizeDouble((LastLots* LotMultiply  ),2),Bid,Slippage,0,0,Ordercomment,MagicID,0,clrRed); 
               bool LiB=false;
        LiB=OrderModify(ticket,OrderOpenPrice(),Bid+SL_Pip*g_Point,Bid-(TP_Pip*g_Point),0,clrRed); 
             return;
         }
     }
}
}

void myAvg1(){
         int      iCount      =  0;
         double   LastOP      =  0;
         double   LastLots    =  0;
         bool     LastIsBuy   =  false;
         int      iTotalBuy   =  0;
         int      iTotalSell  =  0;         

         double   Spread      = 0.0;   
         Spread= MarketInfo(Symbol(), MODE_SPREAD); 

   int pos = -1 ;
   for(int i = 0 ; i < BytesToRead - 1 ; i++)
     {
      if(!(data[i][0]<Time[0]))
         break;
      pos = i + 1;
     }

         for(iCount=0;iCount<OrdersTotal();iCount++){                  
           bool iCount1=false;
        iCount1=OrderSelect(iCount,SELECT_BY_POS,MODE_TRADES);          
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicID)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP>OrderOpenPrice()) {LastOP=OrderOpenPrice();}
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=true;
               iTotalBuy++;
             }

           if(OrderType()==OP_SELL && OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicID)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP<OrderOpenPrice()) {LastOP=OrderOpenPrice();}         
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=false;
               iTotalSell++;
            }         
         }      

         /* Jika arah Price adalah DOWNTREND...., Periksa nilai Bid (*/
         if(LastIsBuy)
         {
         if(data[pos][1]>Open[0])
         {
            if(IsBuyPinbar() && Bid<=LastOP-(Order_Distance*Point )){
               ticket=OrderSend(Symbol(),OP_BUY,NormalizeDouble((LastLots* LotMultiply  ),2),Ask,Slippage,0,0,Ordercomment,MagicID,0,clrGreen);
               hitung();
               tpsl(); 
                LastIsBuy=false;   
               return;
            }
         }
         }
         /* Jika arah Price adalah Sell...., Periksa nilai Ask (*/
         else if(!LastIsBuy)
         {
         if(data[pos][1]<Open[0] )
         { 
            if(IsSellPinbar() && Ask>=LastOP+(Order_Distance*Point )){
             ticket =OrderSend(Symbol(),OP_SELL,NormalizeDouble((LastLots* LotMultiply  ),2),Bid,Slippage,0,0,Ordercomment,MagicID,0,clrRed); 
              hitung();
              tpsl(); 
             return;
         }
     }
}
}

void hitung()
{
    Buy    = 0; lotbuy = 0; lotsbuy = 0; Sell = 0; lotsell = 0; lotssell = 0; SUM = 0; SWAP = 0; profitbuy = 0; profitsell = 0;
    sumbuy = 0; sumsell = 0; bepbuy = 0; bepsell = 0; lowlotbuy = 9999; lowlotsell = 9999; hisell = 0; lobuy = 999999999;

    for (int i = 0; i < OrdersTotal(); i++)
    {
        bool hitung1=false;
        hitung1=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderSymbol() != Symbol() )
        {
            continue;
        }

        if (OrderType() == OP_BUY  )
        {
            Buy++; OP++; lotbuy = OrderLots();
            profitbuy          += OrderProfit(); lotsbuy += OrderLots(); lowlotbuy = MathMin(lowlotbuy, OrderLots());
            sumbuy             += OrderLots() * OrderOpenPrice(); lobuy = MathMin(lobuy, OrderOpenPrice());
        }

        if (OrderType() == OP_SELL )
        {
            Sell++; OP++; lotsell = OrderLots();
            profitsell           += OrderProfit(); lotssell += OrderLots(); lowlotsell = MathMin(lowlotsell, OrderLots());
            sumsell              += OrderLots() * OrderOpenPrice(); hisell = MathMax(hisell, OrderOpenPrice());
        }
    }

    if (lotsbuy > 0)
    {
        bepbuy = sumbuy / lotsbuy;
    }
    if (lotssell > 0)
    {
        bepsell = sumsell / lotssell;
    }
}  // end hitung

double ND(double p)
{
    return(NormalizeDouble(p, Digits));
}

void tpsl( )
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        bool TPSL1=false;
        TPSL1=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderSymbol() != Symbol() )
        {
            continue;
        }

        if (OrderType() == OP_BUY )
        {
            double oTPB = (bepbuy + TP_Pip * Point ) * (TP_Pip > 0);  double oSLB = OrderStopLoss();
            if (SL_BEP_minus > 0)
                oSLB = (bepbuy - SL_BEP_minus * Point );
            if (Buy == 1)
            {
                oTPB = ND(OrderOpenPrice() + TP_Pip   * Point ) * (TP_Pip > 0);  if ( StopLoss  > 0)
                    oSLB = (OrderOpenPrice() -  StopLoss  * Point );
            }
            oTPB = ND(oTPB); oSLB = ND(oSLB);
            if (Bid >= oTPB && oTPB > 0)
                bool BEPSL=false;
        BEPSL=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, CLR_NONE);
            if (Bid <= oSLB)
                bool OPbuyTPSL=false;
        OPbuyTPSL=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, CLR_NONE);

            if (ND(OrderTakeProfit()) != oTPB || ND(OrderStopLoss()) != oSLB)
            {
                if (!OrderModify(OrderTicket(), OrderOpenPrice(), oSLB, oTPB, OrderExpiration()))
                {
                    Print(OrderTicket() + " MODIFY TP  @ " + DoubleToStr(oTPB, Digits) + " SL @ " + DoubleToStr(oSLB, Digits) + " ");
                }
            }
          {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
          }
        }

        if (OrderType() == OP_SELL )
        {
            double oTPS = (bepsell - TP_Pip* Point ) * (TP_Pip> 0);  double oSLS = OrderStopLoss();
            if (SL_BEP_minus > 0)
                oSLS = (bepsell + SL_BEP_minus * Point );
            if (Sell == 1)
            {
                oTPS = (OrderOpenPrice() - TP_Pip * Point ) * (TP_Pip> 0); if ( StopLoss  > 0)
                    oSLS = (OrderOpenPrice() +  StopLoss  * Point );
            }
            oTPS = ND(oTPS); oSLS = ND(oSLS);
            if (Ask <= oTPS)
                bool BTPSL=false;
        BTPSL=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, CLR_NONE);
            if (Ask >= oSLS && oSLS > 0)
                bool OPsellTPSL=false;
        OPsellTPSL=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, CLR_NONE);

            if (ND(OrderTakeProfit()) != oTPS || ND(OrderStopLoss()) != oSLS)
            {
                if (!OrderModify(OrderTicket(), OrderOpenPrice(), oSLS, oTPS, OrderExpiration()))
                {
                    Print(OrderTicket() + "MODIFY TP  @ " + DoubleToStr(oTPS, Digits) + " SL @ " + DoubleToStr(oSLS, Digits) + " ");
                }
            }
            {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
          }
        }
    }
}

void ReadFileHst(string FileName)
  {
   int       j=0;;
   string    strFileContents;
   int       Handle;
   int       LogFileSize;
   int       movehigh[1]= {0};
   uchar     buffer[];
   int       nNumberOfBytesToRead;
   int       read[1]= {0};
   int       i;
   double    mm;

   strFileContents="";
   Handle=CreateFileW(FileName,(int)0x80000000,3,0,3,0,0);

   if(Handle==-1)
     {
      Comment("");
      return;
     }
   LogFileSize=GetFileSize(Handle,0);

   if(LogFileSize<=0)
     {
      return;
     }

   if((LogFileSize-148)/60==BytesToRead)
     {
      return;
     }
   SetFilePointer(Handle,148,movehigh,0);

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

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

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

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

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

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

Стоимость полного кода
3 357,80₽ ≈ $41.04