а на чём основан вывод о неправильности?
25, 0 - если это параметры индикатора и название написано правильно, то всё нормально.
У меня не получается прикрепить файл, поэтому выложу код.
Открытие и закрытие позиций на покупку происходит правильно. А вот на продажу- или не открывает, или отроет и тут же закроет раз сто. Что только не менял не получалось зделать нормально.
Я думаю, что слишком просто я его вставил, а по другому не умею.
Принцип пересечения трех мувингов с фильтрацией каким то индикатором мне понравился, поэтому и хочу довести до ума.
Ссылка на индюк
http://www.fxexpert....o...c=465&st=20#property copyright "Виктор Чеботарёв"
#property link "
http://www.chebotariov.co.ua/"#define MAGIC 29062006
extern int ShortEma = 8; // Период короткой MA
extern int LongEma = 75; // Период длинной MA
extern int KvikEma = 5; // Период быстрой MA
extern int ShiftEma = 3;
extern int Fisher_yur4ik = 150;
extern int RiskMax=10;
extern double LotsMax=90.0;
extern int DecreaseFactor=6;
extern int TakeProfit=110;
extern int StopLoss=80;
extern int TrailingStop=70;
//+------------------------------------------------------------------+
//| Расчет оптимального размера лота |
//+------------------------------------------------------------------+
double LotsOptimized()
{
//----
double Lots=NormalizeDouble(AccountBalance()*RiskMax/(100000.0*Ask),1);
if(AccountFreeMargin()<(1000*Ask*Lots))
{
Lots=NormalizeDouble(AccountFreeMargin()*RiskMax/(100000.0*Ask),1);
}
if(Lots>LotsMax)
{
Lots=LotsMax;
Print("Превышен максимальный размер лота. Размер лота изменен на ",LotsMax);
}
int orders=HistoryTotal();
int losses=0;
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка в истории!");
break;
}
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC || OrderType()>OP_SELL)continue;
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1)
{
Lots=NormalizeDouble(Lots/(DecreaseFactor*losses),1);
}
}
if(Lots<MarketInfo(Symbol(),MODE_MINLOT))
{
Lots=MarketInfo(Symbol(),MODE_MINLOT);
}
double raznica = MathMod(Lots,MarketInfo(Symbol(),MODE_LOTSTEP));
if(raznica>0.0)
{
Lots -= raznica;
}
//----
return(Lots);
}
//+------------------------------------------------------------------+
bool symbolOrders()
{
//----
int orders = OrdersTotal();
for(int i=orders-1; i>=0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS ))
{
Print("OrderSelect( ", i, ", SELECT_BY_POS ) - Error #", GetLastError());
continue;
}
if(OrderSymbol()==Symbol())
{
if(OrderMagicNumber()==MAGIC)
{
return(true);
}
}
}
//----
return(false);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, ticket;
int total=OrdersTotal();
if(Bars<100)
{
Print("Количество баров меньше 100");
return(0);
}
if(TakeProfit<10 && TakeProfit>0)
{
TakeProfit=10;
Print("Размер TakeProfit был меньше 10, поэтому изменен на 10");
}
double Fisher= iCustom(NULL, 0, "FX_FISH",25,0,1,1);
double SEma0 = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0);
double SEma1 = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,ShiftEma);
double LEma0 = iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,0);
double LEma1 = iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,ShiftEma);
double KEma0 = iMA(NULL,0,KvikEma,0,MODE_EMA,PRICE_CLOSE,0);
double KEma1 = iMA(NULL,0,KvikEma,0,MODE_EMA,PRICE_CLOSE,ShiftEma);
if(!symbolOrders())
{
if(AccountFreeMargin()<(1000*LotsOptimized()))
{
Print("У Вас недостаточно денег. Свободной маржи = ", AccountFreeMargin());
return(0);
}
if(Fisher>0.3 && KEma0>LEma0 && KEma0>SEma0) {
if(!IsTradeAllowed())
{
Print("AD BUY: Торговый поток занят.");
return(0);
}
ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"EMA BUY",MAGIC,0,CLR_NONE);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("Открыта позиция на покупку по сигналу EMA BUY: ",OrderOpenPrice());
}
else
{
Print("Ошибка открытия позиции на покупку по сигналу EMA BUY: ",GetLastError());
return(0);
}
}
}
if(Fisher<-0.3 && KEma0<LEma0 && KEma0<SEma0) {
if(!IsTradeAllowed())
{
Print("EMA SELL: Торговый поток занят.");
return(0);
}
ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"EMA SELL",MAGIC,0,CLR_NONE);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("Открыта позиция на продажу по сигналу EMA SELL: ",OrderOpenPrice());
}
else
{
Print("Ошибка открытия позиции на продажу по сигналу EMA SELL: ",GetLastError());
return(0);
}
}
}
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
if(OrderType()==OP_BUY)
{
if(Fisher < 0.15) {
if(!IsTradeAllowed())
{
Print("Order сlose: Торговый поток занят.");
return(0);
}
OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
return(0);
}
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
if(!IsTradeAllowed())
{
Print("Trailing stop: Торговый поток занят.");
return(0);
}
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE);
return(0);
}
}
}
}
else
{
if(Fisher > -0.15) {
if(!IsTradeAllowed())
{
Print("Order сlose: Торговый поток занят.");
return(0);
}
OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
return(0);
}
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
if(!IsTradeAllowed())
{
Print("Trailing stop: Торговый поток занят.");
return(0);
}
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE);
return(0);
}
}
}
}
}
}
//----
return(0);
}