anti-martingale by ma.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «anti-martingale by ma.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой торговый советник для платформы MetaTrader 4, написанный на языке MQL4. Основная стратегия основана на пересечении двух скользящих средних (быстрой и медленной): при пересечении вверх открывается покупка, при пересечении вниз — продажа.
Советник поддерживает динамический расчёт объёма позиции на основе процента риска от собственного капитала, а также режим антимартингейла с дозакрытием позиций при убытках. Доступна настройка стоп-лосса и тейк-профита в пунктах.
Реализована функция трейлинг-стоп с минимальным уровнем прибыли для его активации. Также предусмотрены ограничения по времени торговли и возможность проверки торговых сигналов только по завершении нового бара для снижения избыточных сделок.
Настройки программы
| Настройка | Описание |
|---|---|
| InitalLotSize | Начальный размер лота для открытия позиции. Может пересчитываться динамически при включённом режиме DynamicLotSize. |
| StopLoss | Уровень стоп-лосса в пунктах для открытых позиций. |
| TrailingStopLoss | Расстояние трейлинг-стопа в пунктах от текущей цены позиции. |
| TrailingMinProfit | Минимальная прибыль в пунктах, при достижении которой активируется трейлинг-стоп. |
| AntiMartingaleStopLoss | Уровень стоп-лосса в пунктах, используемый для расчёта дозакрытия позиций в режиме антимартингейла. |
| AntiMartingaleMinLotInc | Минимальный инкремент лота для дозакрытия позиции в режиме антимартингейла. |
| TakeProfit | Уровень тейк-профита в пунктах для открытых позиций. |
| EquityRiskPercentage | Процент собственного капитала, рискуемый на одну позицию, используемый при динамическом расчёте размера лота. |
| Slippage | Допустимое отклонение цены исполнения ордера от запрашиваемой цены в пунктах. |
| MagicNumber | Уникальный идентификатор (магическое число) для идентификации ордеров, открытых данным советником. |
| FastMAPeriod | Период быстрой скользящей средней, используемой для формирования торговых сигналов. |
| SlowMAPeriod | Период медленной скользящей средней, используемой для формирования торговых сигналов. |
| useAntiMartingale | Переключатель: при включении советник рассчитывает и открывает дозакрытие позиций при убытках по имеющейся позиции. |
| CheckOncePerBar | Переключатель: при включении торговой алгоритм запускается только при появлении нового ценового бара, что снижает количество повторных сигналов внутри бара. |
| useTimer | Переключатель: при включении торговля разрешена только в заданном временном диапазоне между AllowedTradeStartTime и AllowedTradeEndTime. |
| useLocalTimeInTimer | Переключатель: при включении для проверки торгового времени используется локальное время сервера, иначе — текущее серверное время. |
| AllowedTradeStartTime | Начальное время разрешённой торговли в формате даты и времени. Используется совместно с AllowedTradeEndTime для ограничения временного окна открытия сделок. |
| AllowedTradeEndTime | Конечное время разрешённой торговли в формате даты и времени. Используется совместно с AllowedTradeStartTime для ограничения временного окна открытия сделок. |
| DynamicLotSize | Переключатель: при включении размер лота рассчитывается автоматически на основе процента риска от собственного капитала, а не фиксированного начального значения. |
Поиск по коду файла
???//+------------------------------------------------------------------+
#include <IncludeExample.mqh>
#include <stdlib.mqh>
#property version "1.00"
#property strict
extern double InitalLotSize=0.5;
extern double StopLoss=50;
extern double TrailingStopLoss=50;
extern double TrailingMinProfit=-100;
extern double AntiMartingaleStopLoss=50;
extern double AntiMartingaleMinLotInc=0.1;
extern double TakeProfit=100;
extern double EquityRiskPercentage=4;
extern int Slippage=5;
extern int MagicNumber=123;
extern int FastMAPeriod = 10;
extern int SlowMAPeriod = 20;
extern bool useAntiMartingale=true;
extern bool CheckOncePerBar=true;
extern bool useTimer=false;
extern bool useLocalTimeInTimer=false;
extern string AllowedTradeStartTime="1970.1.1.0.0";
extern string AllowedTradeEndTime="2099.12.31.23.59";
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;
datetime currentTimeStamp;
input bool DynamicLotSize=true;
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
// код доступен только после оплаты
}
double BuyStopLoss=0;
double BuyTakeProfit=0;
double OpenPrice=0;
double SellStopLoss=0;
double SellTakeProfit=0;
bool newBar=false;
int barShift=0;
bool isTradeAllowed=false;
datetime currentTime=TimeLocal();
datetime tradeStartTime=StrToTime(AllowedTradeStartTime);
datetime tradeEndTime=StrToTime(AllowedTradeEndTime);
if(useLocalTimeInTimer)
currentTime=TimeLocal();
else
currentTime=TimeCurrent();
if(useTimer)
{
if(currentTime<=tradeEndTime && currentTime>=tradeStartTime)
{
isTradeAllowed=true;
}
else
{
isTradeAllowed=false;
}
}
else
isTradeAllowed=true;
if(CheckOncePerBar)
{
barShift=1;
if(currentTimeStamp==Time[0])
{
newBar=false;
}
else
{
Alert("OnTick(): New time bar is drawn, should trigger trading algorithm.");
currentTimeStamp=Time[0]; //Adjust currentTimeStamp to open time of latest K bar.
newBar=true;
}
}
if(newBar && isTradeAllowed) // Check trade condition is allowed to run
{
Alert("OnTick(): Trade condition true, trade decision started at ",currentTimeStamp);
if(FastMAPeriod>=SlowMAPeriod)
{
string ErrLog;
Alert("OnTick(): FastMAPeriod is longer than SlowMAPeriod, EA should not proceed.");
ErrLog=StringConcatenate("OnTick(): FastMAPeriod is longer than SlowMAPeriod, EA should not proceed.");
Print(ErrLog);
return;
}
double FastMA = iMA(NULL,0, FastMAPeriod,0,MODE_SMA,PRICE_CLOSE,barShift);
double SlowMA = iMA(NULL,0, SlowMAPeriod,0,MODE_SMA,PRICE_CLOSE,barShift);
Alert("OnTick(): FastMA=",FastMA,",SlowMA=",SlowMA,", BuyTicket=",BuyTicket,",SellTicket=",SellTicket);
if(FastMA>=SlowMA)
{
Alert("OnTick(): Buy action: FastMA=",FastMA,",SlowMA=",SlowMA,", BuyTicket=",BuyTicket,",SellTicket=",SellTicket);
CloseAllSellOrders(Symbol(),MagicNumber,UseSlippage);
Alert("OnTick(): SellMarketCount() now returns ",SellMarketCount(Symbol(),MagicNumber));
if(SellMarketCount(Symbol(),MagicNumber)==0)
{
SellTicket=0;
Alert("OnTick(): reset SellTicket to ",SellTicket);
}
CloseAllSellStopOrders(Symbol(),MagicNumber);
Alert("OnTick(): SellStopCount() now returns ",SellStopCount(Symbol(),MagicNumber));
CloseAllSellLimitOrders(Symbol(),MagicNumber);
Alert("OnTick(): SellLimitCount() now returns ",SellLimitCount(Symbol(),MagicNumber));
OpenPrice=Ask;
int marketOrderCnt=BuyMarketCount(Symbol(),MagicNumber);
if(marketOrderCnt==0)
{
InitalLotSize=CalcLotSize(DynamicLotSize,EquityRiskPercentage,StopLoss,InitalLotSize);
InitalLotSize=VerifyLotSize(InitalLotSize);
Alert("OnTick(): DynamicLotSize=",DynamicLotSize,", InitalLotSize=",InitalLotSize);
if(StopLoss>0)
{
BuyStopLoss=CalcBuyStopLoss(Symbol(),StopLoss,OpenPrice);
BuyStopLoss=AdjustBelowStopLevel(Symbol(),BuyStopLoss);
}
if(TakeProfit>0)
{
BuyTakeProfit=CalcBuyTakeProfit(Symbol(),TakeProfit,OpenPrice);
BuyTakeProfit=AdjustAboveStopLevel(Symbol(),BuyTakeProfit);
}
BuyTicket=OpenBuyOrder(Symbol(),InitalLotSize,UseSlippage,MagicNumber);
AddStopProfit(BuyTicket,BuyStopLoss,BuyTakeProfit);
Alert("OnTick(): BuyTicket=",BuyTicket,", TP=",BuyTakeProfit,", SL=",BuyStopLoss);
if(BuyTicket==-1)
{
Alert("OnTick(): Problem to open buy order, BuyTicket=",BuyTicket);
BuyTicket=0;
Alert("OnTick(): Problem to open buy order, now BuyTicket reset to ",BuyTicket);
}
}
else if(marketOrderCnt>0 && useAntiMartingale)
{
double newLotShouldAdd=CalcMartingaleLotSize(MagicNumber,AntiMartingaleStopLoss,AntiMartingaleMinLotInc);
bool selected=OrderSelect(BuyTicket,SELECT_BY_TICKET);
if(selected==false)
{
int ErrorCode=GetLastError();
string ErrDesc=ErrorDescription(ErrorCode);
string ErrAlert=StringConcatenate(Symbol(),"OnTick(): Select First Buy Order - Error: ",ErrПоказано первые 50% кода (символов: 8338)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.