charles2_1_8a.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «charles2_1_8a.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Charles — торговый советник для MetaTrader 4, написанный на языке MQL4. Советник анализирует ценовые данные и технические индикаторы для принятия торговых решений по нескольким валютным парам. Он поддерживает как рыночные, так и отложенные ордера, а также управление позициями через стоп-лосс, тейк-профит и трейлинг-стоп.
Советник использует комбинацию RSI, EMA, Bollinger Bands, ATR и ADX для определения направления тренда и волатильности. Он вычисляет уровни пивотов и зоны поддержки/сопротивления для модификации тейк-профита. Лотность рассчитывается на основе процента риска от баланса или фиксированного значения лотов.
Система управления рисками включает проверку маржи перед открытием ордеров, аварийную блокировку при превышении допустимого убытка и механизм хеджирования корзины убыточных ордеров против прибыльных. Советник может работать в заданном временном окне и автоматически закрывать все позиции в пятницу.
Настройки программы
| Настройка | Описание |
|---|---|
| Comment_1 | Комментарий 1 — Подсказка: список пар символов через запятую |
| Comment_1a | Комментарий 1a — Подсказка: строка провайдера аккаунта |
| Symbols | Символы — Список валютных пар для торговли через запятую |
| MagicNumber | Магический номер — Идентификатор ордеров советника |
| xFactor | Коэффициент хеджирования — Множитель для расчёта лота хеджа |
| TimeSet | Время сброса — Время ежедневного сброса условий |
| Comment_2 | Комментарий 2 — Подсказка: процент баланса и значение лота |
| RiskPercent | Риск в процентах — Процент баланса для расчёта размера лота |
| Comment_3 | Комментарий 3 — Подсказка: процент риска на каждый лот |
| Comment_3a | Комментарий 3a — Подсказка: автоматическая адаптация к числу пар |
| RiskPerTrade | Риск на сделку — Процент риска на одну сделку для расчёта лота |
| MaxAllowedOrders | Максимум ордеров — Максимально допустимое количество открытых ордеров |
| MaxOpenHours | Максимум часов открытия — Максимальное время нахождения ордера в открытом состоянии |
| ProfitCheckPeriod | Период проверки прибыли — Период в минутах для проверки достижения прибыли |
| Comment_4 | Комментарий 4 — Подсказка: использование строгих уровней поддержки и сопротивления |
| Aggressive | Агрессивный режим — Использовать более агрессивные периоды для уровней поддержки и сопротивления |
| UsePivots | Использовать пивоты — Модифицировать тейк-профит на основе уровней пивотов |
| Comment_5 | Комментарий 5 — Подсказка: оставлять прибыльные ордера открытыми |
| FastPeriod | Быстрый период — Период быстрой EMA для анализа тренда |
| SlowPeriod | Медленный период — Период медленной EMA для анализа тренда |
| Selectivity | Селективность — Период RSI для определения условий входа |
| Comment_6 | Комментарий 6 — Подсказка: фиксированное значение лота при нулевом риске |
| Lots | Лоты — Фиксированный размер лота |
| Slippage | Слиппаж — Максимально допустимый слиппаж в пунктах |
| Comment_7 | Комментарий 7 — Подсказка: настройка для ECN/STP брокеров |
| ECN | ECN режим — Флаг использования ECN/STP брокера |
| MarginPercent | Процент маржи — Процент свободной маржи для проверки перед открытием ордера |
| Comment_8 | Комментарий 8 — Подсказка: стоп-лосс на все ордера |
| StopLoss | Стоп-лосс — Размер стоп-лосса в пунктах |
| TrailStart | Начало трейлинга — Уровень в пунктах для начала движения стоп-лосса |
| TrailingAmount | Шаг трейлинга — Шаг движения стоп-лосса в пунктах |
| TakeProfit | Тейк-профит — Размер тейк-профита в пунктах |
| Comment_9 | Комментарий 9 — Подсказка: управление всеми открытыми ордерами |
| AllOrders | Все ордера — Управлять всеми открытыми ордерами включая ручные |
| Comment_10 | Комментарий 10 — Подсказка: расчёт прибыли по всем парам |
| AllSymbols | Все символы — Рассчитывать прибыль по всем парам, а не только по текущему |
| Comment_11 | Комментарий 11 — Подсказка: логирование в консоль или файл |
| LogToFile | Лог в файл — Записывать логи в файл вместо консоли |
| Comment_12 | Комментарий 12 — Подсказка: удаление отложенных ордеров при инициализации |
| InitResetOrders | Сброс ордеров при инициализации — Удалять все отложенные ордера при запуске |
| Comment_13 | Комментарий 13 — Подсказка: управление временем торговли |
| StartHour | Час начала — Час начала торговой сессии |
| EndHour | Час окончания — Час окончания торговой сессии |
| CloseAllNow | Закрыть все сейчас — Принудительно закрыть все открытые ордера |
| FridayCloseTime | Время закрытия в пятницу — Час в пятницу для автоматического закрытия всех позиций |
Поиск по коду файла
#define VER "2.1.8"
#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 = "";
extern int MagicNumber = 3939;
extern double xFactor = 2;
extern string TimeSet = "07:32";
extern string Comment_2 = " -- Balance percentage order balance and Lot value";
extern double RiskPercent = 10;
extern string Comment_3 = " -- Percentage of the risk for each Lot";
extern string Comment_3a = " --- auto-adapted to number of pairs.";
extern double RiskPerTrade = 30;
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 = 25;
extern int TrailingAmount = 5;
extern int TakeProfit = 25;
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 = false;
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[], 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()
{
// код доступен только после оплаты
}
int deinit()
{
int Pos;
int Total=OrdersTotal();
if(Total>0)
{for(i=Total-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE)
{
Pos=OrderType();
if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT)){Result=OrderDelete(OrderTicket(), CLR_NONE);}
if(Result<=0){Error=GetLastError();}
else Error=0;
}
}
}
}
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
for(int w=0;w<winners;w++)
{
if( OrderSelect(ordersWinningBasketTkts[w],SELECT_BY_TICKET,MODE_TRADES) )
{
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 && (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;
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>=ProfitCheckPeriod*PERIOD_M15 &&
OrderProfit()+OrderCommission()+OrderSwap()>0 &&
chgFromOpen>0 &&
MathAbs(chgFromOpen-chgFromLown)>=floor && MathAbs(chgFromOpen-chgFromLown)<=ceil &&
chgFromPeak<0 && MathAbs(chgFromPeak)>=floor)
{
for(sx=0; sx<ArraySize(canSell); sx++)
{
canSell[sx] = true;
canBuy[sx] = true;
CloseAll(sx);
}
break;
}
}
}
}
}
}
LastProfit = Profit;
}
else
{
isInGain=false;
}
RefreshRates();
ordersTotal=OrdersTotal();
if(ordersTotal>0)
{
for(i=ordersTotal-1; i>=0; i--)
{
if(OrderSelect(iПоказано первые 50% кода (символов: 47661)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.