lots - объем торговой операции
fast_ma_period - период быстрой скользящей средней (Moving Average)
medium_ma_period - период средней линии скользящей средней (Moving Average)
slow_ma_period - период медленной скользящей средней (Moving Average)
ma_method - Метод усреднения индикатора MA. (0 - Простое скользящее среднее; 1 - Экспоненциальное скользящее среднее; 2 - Сглаженное скользящее среднее; 3 - Линейно-взвешенное)
applied_price - Используемая цена индикатора. (0 - Цена закрытия; 1 - Цена открытия; 2 - Максимальная цена; 3 - Минимальная цена; 4 - Средняя цена, (high+low)/2; 5 - Типичная цена, (high+low+close)/3; 6 - Взвешенная цена закрытия, (high+low+close+close)/4)
close_variant - Вариант закрытия позиций(0 - любое пересечение; 1 - закрываем при пересечении быстрой и медленной линии МА; 2 - закрываем при пересечении быстрого и среднего индикаторов)
take_profit - значение уровня прибыльности (take profit) для открываемого ордера (0 - не использовать take profit).
stop_loss - значение уровня убыточности (stop loss) для открываемого ордера (0 - не использовать stop loss).
Что бы хотелось:
1. Возможность выстаыления время работы советника
2. Возможность выставления трала , а так же его отключения.
Зарание огромное СПАСИБО, кто поможет.
Сам код советника:
//+------------------------------------------------------------------+
//| 3MA_.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright "3MA"
#define magic 2342002
//---- input parameters
extern double lots=0.1;
extern int fast_ma_period=10;
extern int medium_ma_period=25;
extern int slow_ma_period=50;
extern int ma_method=0;
extern int applied_price=0;
extern int close_variant = 2;
extern int take_profit=0;
extern int stop_loss=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
bool can_buy = false, can_sell = false;
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
double fma_prev=double iMA( Symbol(), 0, fast_ma_period, 0, ma_method, applied_price, 2);
double fma_next=double iMA( Symbol(), 0, fast_ma_period, 0, ma_method, applied_price, 1);
double mma_prev=double iMA( Symbol(), 0, medium_ma_period, 0, ma_method, applied_price, 2);
double mma_next=double iMA( Symbol(), 0, medium_ma_period, 0, ma_method, applied_price, 1);
double sma_prev=double iMA( Symbol(), 0, slow_ma_period, 0, ma_method, applied_price, 2);
double sma_next=double iMA( Symbol(), 0, slow_ma_period, 0, ma_method, applied_price, 1);
//----
int i;
int err;
//закрываем при пересечени быстрой и медленной
if (close_variant == 1 || close_variant == 0)
{
//закрываем SELL orders
if (fma_prev<=sma_prev && fma_next>sma_next && ChekForOrders(OP_SELL) > 0)
{
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if ( OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==magic)
if (OrderClose(OrderTicket(),OrderLots(),Ask,0,Red)==false)
{
//если не получилось закрыть
err=GetLastError();
Print("OrderSend failed with error #",err);
}
}
}
//закрываем BUY orders
if (fma_prev>=sma_prev && fma_next<sma_next && fma_next<mma_next && ChekForOrders(OP_SELL)==0)
{
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if ( OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==magic)
if (OrderClose(OrderTicket(),OrderLots(),Bid,0,Red)==false)
{
//если не получилось закрыть
err=GetLastError();
Print("OrderSend failed with error #",err);
}
}
}
}
//закрываем при пересечени быстрой и средней
if (close_variant == 2 || close_variant == 0)
{
//закрываем SELL orders
if (fma_prev<=mma_prev && fma_next>mma_next && ChekForOrders(OP_SELL) > 0)
{
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if ( OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==magic)
if (OrderClose(OrderTicket(),OrderLots(),Ask,0,Red)==false)
{
//если не получилось закрыть
err=GetLastError();
Print("OrderSend failed with error #",err);
}
}
}
//закрываем BUY orders
if (fma_prev>=mma_prev && fma_next<mma_next && ChekForOrders(OP_SELL)==0)
{
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if ( OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==magic)
if (OrderClose(OrderTicket(),OrderLots(),Bid,0,Red)==false)
{
//если не получилось закрыть
err=GetLastError();
Print("OrderSend failed with error #",err);
}
}
}
}
//быстрая линия должна пересечь обе
if (fma_next > sma_next && fma_next > mma_next)
can_sell = true;
if (fma_next < sma_next && fma_next < mma_next)
can_buy = true;
//если было пересечение вверх и нет активных BUY то
if ((fma_prev<=sma_prev || fma_prev<=mma_prev) && fma_next>sma_next && fma_next>mma_next && ChekForOrders(OP_BUY)==0 && can_buy)
{
//создаем buy
OrderSendFunc(OP_BUY);
can_buy = false;
}
//если было пересечение вниз то
if ((fma_prev>=sma_prev || fma_prev>=mma_prev) && fma_next<sma_next && fma_next<mma_next && ChekForOrders(OP_SELL)==0 && can_sell)
{
//создаем SELL
OrderSendFunc(OP_SELL);
can_sell = false;
}
return(0);
}
//+------------------------------------------------------------------+
//Отправляет запрос типа cmd
int OrderSendFunc(int cmd)
{
if (cmd==OP_BUY) double Price=Ask;
else Price=Bid;
int ticket=OrderSend(Symbol(),cmd,lots,Price,0,GetSL(cmd),GetTP(cmd),NULL,magic,0,Blue);
if(ticket<0)
{
int err=GetLastError();
if (err==135)
{
//если ошибка "цены изменились" то делаем вторую попытку
RefreshRates();
ticket=OrderSend(Symbol(),cmd,lots,Price,0,GetSL(cmd),GetTP(cmd),NULL,magic,0,Blue);
if (ticket<0)
{
err=GetLastError();
Print("OrderSend failed with error #",err);
}
else Print("OrderSend failed with error #",err);
return(-1);
}
}
return(ticket);
}
// Функция возвращает значение цены с учетом StopLoss.
//Для Buy Order: cmd=OP_BUY, для Sell: cmd=OP_SELL
double GetSL(int cmd)
{
if (stop_loss==0) return(0);
else
if (cmd==OP_BUY) return(Bid-stop_loss*Point);
else return(Ask+stop_loss*Point);
}
// Функция возвращает значение цены с учетом TakeProfit.
//Для Buy Order: cmd=OP_BUY, для Sell: cmd=OP_SELL
double GetTP(int cmd)
{
if (take_profit==0) return(0);
else
if (cmd==OP_BUY) return(Ask+take_profit*Point);
else return(Bid-take_profit*Point);
}
//*Функция определяет количество позиций типа cmd*
int ChekForOrders(int cmd)
{
int count=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if (OrderSymbol()==Symbol() && OrderType()==cmd && OrderMagicNumber()==magic)
count++;
}
return(count);
}