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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.