помощь эксперта

 

может ли кто-нибудь помочь мне настроить советника?

Он может работать лучше - все, что я вижу, это покупки и продажи в неправильных местах.

Файлы:
jbtest3.mq4  5 kb
 
delcor wrote >>

может ли кто-нибудь помочь мне настроить советника?

Он может работать лучше - все, что я вижу, это покупки и продажи в неправильных местах.

Не хотите ли вы объяснить свою стратегию? Прежде чем приступить к настройке советника, нам нужно проверить, соответствует ли его коды заявленной стратегии.

Если коды верны, но мы получаем плохие сделки от советника, значит, виновата стратегия? Хорошо ли работает стратегия при ручной торговле?

 
ronaldosim:

Не хотите ли вы объяснить свою стратегию? Нам нужно проверить, закодирована ли она в соответствии с заявленной стратегией, прежде чем мы сможем ее доработать.

Если коды верны, но мы получаем плохие сделки от советника, значит, виновата стратегия? Хорошо ли работает стратегия при ручной торговле?

Спасибо, что откликнулись

стратегия заключается в том, что она должна покупать или продавать только при пересечении ema. есть настройки, которые хорошо работают, и если она покупает и продает только при пересечении ema, то она получает прибыль.

Я привязал ее как есть, но она не покупает на пересечении двух эма.

Он должен закрывать открытый ордер и покупать, когда короткая эма пересекает длинную эму и наоборот. на данном этапе я хочу, чтобы он делал только это.

Затем мы можем сделать второй этап. На этом этапе нет управления капиталом. Я новичок в программировании, но хочу узнать больше.

Вы можете мне помочь?

как есть, он делает работу на eur/usd 15 и 1h tf - но не достаточно

 
delcor wrote >>

спасибо, что вернулись

стратегия заключается в том, что она должна покупать или продавать только при пересечении ema. есть настройки, которые хорошо работают, и если она будет покупать и продавать только при пересечении ema, то она будет брать прибыль.

Я привязал ее как есть, но она не покупает на пересечении двух эм.

Он должен закрывать открытый ордер и покупать, когда короткая эма пересекает длинную и наоборот. на данном этапе я хочу, чтобы он делал только это.

Затем мы можем сделать второй этап. На этом этапе нет управления капиталом. Я новичок в программировании, но хочу узнать больше.

Вы можете мне помочь?

как есть, он делает работу на eur/usd 15 и 1h tf - но недостаточно.

Я подозреваю, что это так; для крестов EMA ваш код неверен

Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);

вам нужно два iMA для лонгема и шортема.

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

и проверка на пересечение

if (SEMA1>LEMA1 && SEMA2<LEMA2) send buy order

и на продажу

если (SEMA1<LEMA1 && SEMA2>LEMA2) отправляем ордер на продажу

 
ronaldosim:

Я подозреваю, что это так; для кроссов EMA ваш код некорректен

Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);

вам нужно два iMA для лонгема и шортема.

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

и проверка на пересечение

if (SEMA1>LEMA1 && SEMA2<LEMA2) send buy order

и на продажу

если (SEMA1<LEMA1 && SEMA2>LEMA2) отправить ордер на продажу

хорошо, значит

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

должны быть помещены в условия "проверка наличия открытых ордеров - ниже "получить скользящую среднюю"

и "

if (SEMA1>LEMA1 && SEMA2<LEMA2) send buy order", где ?

также LEMA1 и LEMA2 должны быть определены вверху.


все еще новичок в этом

мой скайп delcor59, если вы хотите, чтобы скайп меня

спасибо за помощь

 
delcor wrote >>

так что

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

должны быть помещены в условия "проверка открытых ордеров - ниже "получить скользящую среднюю"

и "

if (SEMA1>LEMA1 && SEMA2<LEMA2) send buy order", где ?

также LEMA1 и LEMA2 должны быть определены вверху.

все еще новичок в этом

мой skype delcor59 если вы хотите skype меня

спасибо за помощь

что-то вроде этого, модифицируя свои собственные коды....

void CheckForOpen()
{
double Ema;
int res;
//---- торгуйте только на первых тиках нового бара
if(Volume[0]>1) return;
//---- получаем скользящую среднюю
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

//---- условия продажи
// if(Open[1]>Ema && Close[1]<Ema)
if (SEMA1<LEMA1 && SEMA2>LEMA2)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//---- условия покупки
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}

void CheckForClose()
{
double Ema;
//---- торгуйте только на первых тиках нового бара
if(Volume[0]>1) return;
//---- получаем скользящую среднюю
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- проверка типа ордера
if(OrderType()==OP_BUY)
{
// if(Open[1]>Ema && Close[1]<Ema)
if (SEMA1<LEMA1 && SEMA2>LEMA2) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}

 
ronaldosim:

что-то вроде этой модификации для ваших собственных кодов....

void CheckForOpen()
{
double Ema;
int res;
//---- переходим к торговле только на первых тиках нового бара
if(Volume[0]>1) return;
//---- получаем скользящую среднюю
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

//---- условия продажи
// if(Open[1]>Ema && Close[1]<Ema)
if (SEMA1<LEMA1 && SEMA2>LEMA2)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
//---- условия покупки
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
//----
}

void CheckForClose()
{
double Ema;
//---- торгуйте только на первых тиках нового бара
if(Volume[0]>1) return;
//---- получаем скользящую среднюю
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0);
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- проверка типа ордера
if(OrderType()==OP_BUY)
{
// if(Open[1]>Ema && Close[1]<Ema)
if (SEMA1<LEMA1 && SEMA2>LEMA2) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
if(OrderType()==OP_SELL)
{
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
}
//----
}

спасибо ещё раз

Что-то не так. Когда я тестирую Ea, он показывает только покупки и никаких продаж.

 
delcor wrote >>

Спасибо еще раз.

Что-то не так. Когда я тестирую Ea, он показывает только покупки и никаких продаж.

заметил, что в зависимости от того, какой ордер запускается первым, т.е. buy или sell, как только начинается кросс, вы запускаете ордер, а когда начинается противоположный кросс, вы закрываете ордер; в yr start(), когда вы проверяете наличие рыночного ордера, вы предотвращаете, чтобы один из типов ордеров никогда не запускался, т.е. когда вы запускаете с buy, это всегда будет buy; когда вы запускаете с sell, это всегда будет sell; уберите это условие проверки.

 
ronaldosim:

заметил, что в зависимости от того, какой ордер запускается первым, т.е. buy или sell, как только начинается кросс, вы запускаете ордер, а когда начинается противоположный кросс, вы закрываете ордер; в yr start(), когда вы проверяете существование рыночного ордера, вы предотвращаете, чтобы один из типов ордеров никогда не запускался, т.е. когда вы запускаете с buy, это всегда будет buy; когда вы запускаете с sell, это всегда будет sell; уберите это условие проверки.

вы имеете в виду условие проверки в нижней части советника?

//+------------------------------------------------------------------+
//| Функция запуска |
//+------------------------------------------------------------------+
void start()
{
//---- проверка истории и торговли
if(Bars<100 || IsTradeAllowed()==false) return;
//---- расчет открытых ордеров по текущему символу
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----

}


потому что там также есть

void CheckForOpen()

void CheckForClose()

 
delcor:

вы имеете в виду условие проверки в нижней части советника

//+------------------------------------------------------------------+
//| Функция запуска |
//+------------------------------------------------------------------+
void start()
{
//---- проверка истории и торговли
if(Bars<100 || IsTradeAllowed()==false) return;
//---- вычисление открытых ордеров по текущему символу
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----

}


потому что там также есть

void CheckForOpen()

void CheckForClose()




скажите мне, есть ли тестовая система в программировании советника, чтобы показать вам шаг за шагом, что происходит, когда работает этот советник?

 
delcor wrote >>

вы имеете в виду условие проверки в нижней части советника

//+------------------------------------------------------------------+
//| Запуск функции |
//+------------------------------------------------------------------+
void start()
{
//---- проверка истории и торговли
if(Bars<100 || IsTradeAllowed()==false) return;
//---- вычисление открытых ордеров по текущему символу
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----

}

потому что там также есть

void CheckForOpen()

void CheckForClose()

if(Bars<100 || IsTradeAllowed()==false) return;
//---- вычисляет открытые ордера по текущему символу
CheckForOpen();
CheckForClose();
//----

Причина обращения: