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