Evgeny240891
Прохожий
Я новичек в програмировании вот код :
Я его прикрепил к графику с 2 средними 15 и 45 , подобрал такой момент когда было пересечение 15 дневной 45 дневной с низу в верх. А советник за место того что бы открыть позицию бай открыл селл, помогите исправить, или объясните почему так????
//+------------------------------------------------------------------+
//| 2MA_fxtrades_ru.mq4 |
//| fxtrades.ru |
//| _http://fxtrades.ru Торговые стратегии ФОРЕКС, роботы/советники FOREX |
//+------------------------------------------------------------------+
#property copyright "fxtrades.ru"
#property link "http://fxtrades.ru"
#define magic 2342001
//---- input parameters
extern double lots=0.1;
extern int fast_ma_period=8;
extern int slow_ma_period=200;
extern int ma_method=0;
extern int applied_price=0;
extern int take_profit=0;
extern int stop_loss=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
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 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, err;
//если было пересечение вверх и нет активных BUY то
if (fma_prev<=sma_prev && fma_next>sma_next && ChekForOrders(OP_BUY)==0)
{
//закрываем SELL orders
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
OrderSendFunc(OP_BUY);
}
//если было пересечение вниз то
if (fma_prev<=sma_prev && fma_next<sma_next && ChekForOrders(OP_SELL)==0)
{
//закрываем BUY orders
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);
}
}
//создаем SELL
OrderSendFunc(OP_SELL);
}
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);
}
//| 2MA_fxtrades_ru.mq4 |
//| fxtrades.ru |
//| _http://fxtrades.ru Торговые стратегии ФОРЕКС, роботы/советники FOREX |
//+------------------------------------------------------------------+
#property copyright "fxtrades.ru"
#property link "http://fxtrades.ru"
#define magic 2342001
//---- input parameters
extern double lots=0.1;
extern int fast_ma_period=8;
extern int slow_ma_period=200;
extern int ma_method=0;
extern int applied_price=0;
extern int take_profit=0;
extern int stop_loss=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
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 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, err;
//если было пересечение вверх и нет активных BUY то
if (fma_prev<=sma_prev && fma_next>sma_next && ChekForOrders(OP_BUY)==0)
{
//закрываем SELL orders
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
OrderSendFunc(OP_BUY);
}
//если было пересечение вниз то
if (fma_prev<=sma_prev && fma_next<sma_next && ChekForOrders(OP_SELL)==0)
{
//закрываем BUY orders
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);
}
}
//создаем SELL
OrderSendFunc(OP_SELL);
}
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);
}
Я его прикрепил к графику с 2 средними 15 и 45 , подобрал такой момент когда было пересечение 15 дневной 45 дневной с низу в верх. А советник за место того что бы открыть позицию бай открыл селл, помогите исправить, или объясните почему так????
Последнее редактирование модератором: