Скачать MetaTrader 5

Написал советник, а он не торгует, в журнале пишет при попытке советника совершить торговую операцию, что это невозможно

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен программист? Оставь заказ и он сам тебя найдет!
alex999
18
alex999 2009.08.20 08:02 

Написал советник, а он не торгует, в журнале пишет при попытке советника совершить торговую операцию:09:27:57 '1661821': trading by experts is prohibited

Привожу код советника!Написан он на основе мною разработанного пользовательского индикатора




#define MAGICMA 20090819


extern double Lots = 0.5;
extern double MaximumRisk = 0.05;
extern double DecreaseFactor = 3;
extern double Rastvor =0.0830;
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1) lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double ma1, ma2, sma1, sma2;
int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma1=iCustom(NULL, 1440, "предсказатель", 0, 0);//Значение синий линии индикатора на нулевом баре
sma1=iCustom(NULL, 1440, "предсказатель", 0, 1); // Значение синий линии индикатора на первом баре
ma2=iCustom(NULL, 1440, "предсказатель", 1, 0);// Значение красной линии индикатора на нулевом баре
sma2=iCustom(NULL, 1440, "предсказатель", 1, 1); // Значение красной линии индикатора на первом баре
//---- sell conditions
if(sma2>sma1 && ma1>ma2+Rastvor)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+0.0100,0,"",MAGICMA,0,Red);
return;
}
//---- buy conditions
if(sma2<sma1 && ma2>ma1+Rastvor)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-0.0100,"",MAGICMA,0,Blue);
return;
}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma1, ma2, sma1, sma2;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
ma1=iCustom(NULL, 1440, "предсказатель", 0, 0);//Значение синий линии индикатора на нулевом баре
sma1=iCustom(NULL, 1440, "предсказатель", 0, 1); // Значение синий линии индикатора на первом баре
ma2=iCustom(NULL, 1440, "предсказатель", 1, 0);// Значение красной линии индикатора на нулевом баре
sma2=iCustom(NULL, 1440, "предсказатель", 1, 1); // Значение красной линии индикатора на первом баре
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(sma2>sma1 && ma1>ma2+Rastvor) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
if(sma2<sma1 && ma2>ma1+Rastvor) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}

//+------------------------------------------------------------------+


Друзья может кто знает почему это! Помогите!

Alexander
2441
Alexander 2009.08.20 08:43  
Ты хочешь, чтобы мы позвонили твоему брокеру и уговорили его разрешить тебе использовать советники?
alex999
18
alex999 2009.08.20 09:00  
Roger >>:
Ты хочешь, чтобы мы позвонили твоему брокеру и уговорили его разрешить тебе использовать советники?

Не, я просто думал/ что проблема в коде программы, а не в самом брокере

Andy_zz
7
Andy_zz 2012.10.22 11:32  

не забывайте про  slippage      --->   OrderSend (symbol ,sell-buy,lot,bid-ask,(!!!СДЕСЬ!!!), stoploss,  takeprofit, comment=NULL magic=0,  expiration=0,  arrow_color=CLR_NONE)

это точность - slippage

её можно посмотреть в  Тестере стратегий   -->  Свойство символа

=)

iicux
5
iicux 2012.10.22 13:35  
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий