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

CITY-ScalperX2 EA

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

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

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

О программе

CITY-ScalperX2 EA — торговый советник для MetaTrader 4, разработанный Citytrader Corp. Советник анализирует рыночные данные, считывая исторические данные из файлов котировок через системные API, и автоматически открывает и управляет ордерами на основе паттернов свечей (pinbar) и индикаторов WPR и AO.

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

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

Для работы советника требуется разрешение на импорт DLL в MetaTrader 4, так как он использует прямое чтение файлов истории. При некорректных условиях запуск советник прекращает работу и выводит соответствующие предупреждения.

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

НастройкаОписание
Pairs Торговые пары — Список торговых пар для работы советника
RunEAonTimeframe Таймфрейм работы — Таймфреймы для работы советника
SettingOrderMode Режим ордеров — Режим управления ордерами
Trade_BySignal Торговля по сигналу — Режим торговли по сигналам: включён или выключен
Order Distance (Order_Distance) Расстояние между ордерами — Расстояние в пунктах между ордерами при усреднении позиций
LotMultiply Множитель лота — Множитель для расчёта размера лота при усреднении позиций
Close_BySignal Закрытие по сигналу — Переключатель автоматического закрытия позиций по сигналам советника
MagicID Магический номер — Магический номер для идентификации ордеров, управляемых советником
LOTS Размер лота — Фиксированный размер лота для торговли
risk: 0-->fixed lots (risk) Риск — Процент риска от баланса для расчёта размера лота (0 — фиксированные лоты)
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) Фиксация прибыли — Уровень фиксации прибыли в пунктах при использовании скользящего стоп-лосса
TimeFilter (UseTimeFilter) Временной фильтр — Переключатель временного фильтра торговли
Start (Start) Время начала — Время начала торговой сессии (чч:мм)
Stop (End1) Время окончания — Время окончания торговой сессии (чч:мм)
Ordercomment Комментарий ордера — Комментарий, присваиваемый открытым ордерам
Получить полный код

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

#property description   "Creat Ea By: Citytrader"
#property description   "Contact Ea Owner Telegram ID: Ceo_CityTrader"
#property description   "This Ea Free All User"
#property description   "Join in Telegram Group : "
#property icon "CityTrader.ico"

int acc_number=0;

bool use_demo=True;
int demo_year=2023;
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;
     }
   SetFilePoint

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

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

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

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

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

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

Стоимость полного кода
3 362,40₽ ≈ $41.10