Как кодировать? - страница 327

 

Привет всем, у меня есть эта конкретная ошибка с моим советником на Stocastic.

Мои критерии таковы:

Когда мой stocEquator пересекает вверх (Uptrend), только длинные сделки будут срабатывать, когда мой stocTrigger пересекает вверх, а когда stocEquator пересекает вниз (Downtrend), только короткие сделки будут срабатывать, когда stocTrigger пересекает вниз.

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

Заранее благодарю за помощь.

С уважением,

Терранс

int isCrossedTrigger = 0;

double shortStoc1Trigger= iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,1);

double longStoc1Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,2);

double longStoc2Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,2);

double diff1Trigger= shortStoc1Trigger-longStoc1Trigger;

double diff2Trigger= shortStoc2Trigger-longStoc2Trigger;

if ((diff1Trigger*diff2Trigger)<0)

{

if (shortStoc1Trigger>longStoc1Trigger)

isCrossedTrigger= 1;

else isCrossedTrigger= 2;

}

int isCrossedEquator = 0;

double shortStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN,1);

double longStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN,2);

double longStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,2);

double diff1Equator = shortStoc1Equator-longStoc1Equator;

double diff2Equator = shortStoc2Equator-longStoc2Equator;

if ((diff1Equator*diff2Equator)<0)

{

if (shortStoc1Equator>longStoc1Equator)

isCrossedEquator = 1;

else isCrossedEquator = 2;

}

if(total < 2)

{

if(isCrossedTrigger== 1 && isCrossedEquator == 1)

{

Купить

}

if(isCrossedTrigger== 2 && isCrossedEquator == 2)

{

Продать

}

{ return(0);

}

return(0);

 
tkuan77:
Привет всем, у меня есть эта конкретная ошибка с моим советником на Stocastic.

Мои критерии таковы:

Когда мой stocEquator пересекает вверх (Uptrend), только длинные сделки будут срабатывать, когда мой stocTrigger пересекает вверх, а когда stocEquator пересекает вниз (Downtrend), только короткие сделки будут срабатывать, когда stocTrigger пересекает вниз.

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

Заранее благодарю за помощь.

С уважением,

Терранс

int isCrossedTrigger = 0;

double shortStoc1Trigger= iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,1);

double longStoc1Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,2);

double longStoc2Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,2);

double diff1Trigger= shortStoc1Trigger-longStoc1Trigger;

double diff2Trigger= shortStoc2Trigger-longStoc2Trigger;

if ((diff1Trigger*diff2Trigger)<0)

{

if (shortStoc1Trigger>longStoc1Trigger)

isCrossedTrigger= 1;

else isCrossedTrigger= 2;

}

int isCrossedEquator = 0;

double shortStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN,1);

double longStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN,2);

double longStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,2);

double diff1Equator = shortStoc1Equator-longStoc1Equator;

double diff2Equator = shortStoc2Equator-longStoc2Equator;

if ((diff1Equator*diff2Equator)<0)

{

if (shortStoc1Equator>longStoc1Equator)

isCrossedEquator = 1;

else isCrossedEquator = 2;

}

if(total < 2)

{

if(isCrossedTrigger== 1 && isCrossedEquator == 1)

{

Купить

}

if(isCrossedTrigger== 2 && isCrossedEquator == 2)

{

Продать

}

{ return(0);

}

return(0);

Терранс

Единственное, что я не смог проверить, это переменную "total".

Код должен работать, если переменная total установлена правильно. Вот тестовый индикатор, который я использовал с вашими условиями, и он подает правильные сигналы на покупку и продажу (запустите индикатор в визуальном режиме, и вы увидите, когда он подает сигнал), так что ошибка где-то в другом месте.

#property indicator_separate_window

#property indicator_buffers 0

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

return(0);

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int total = 0;

int isCrossedTrigger= 0;

double shortStoc1Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,1);

double longStoc1Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,1) ;

double shortStoc2Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,2);

double longStoc2Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,2) ;

double diff1Trigger = shortStoc1Trigger-longStoc1Trigger;

double diff2Trigger = shortStoc2Trigger-longStoc2Trigger;

if ((diff1Trigger*diff2Trigger)<0)

{

if (shortStoc1Trigger>longStoc1Trigger)

isCrossedTrigger= 1;

else isCrossedTrigger= 2;

}

int isCrossedEquator = 0;

double shortStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN, 1);

double longStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN, 2);

double longStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,2);

double diff1Equator = shortStoc1Equator-longStoc1Equator;

double diff2Equator = shortStoc2Equator-longStoc2Equator;

if ((diff1Equator*diff2Equator)<0)

{

if (shortStoc1Equator>longStoc1Equator)

isCrossedEquator = 1;

else isCrossedEquator = 2;

}

//

//

//

//

//

if(total < 2)

{

if(isCrossedTrigger== 1 && isCrossedEquator == 1)

{

Alert("Buy at : "+TimeToStr(Time[0],TIME_DATE|TIME_SECONDS));

}

if(isCrossedTrigger== 2 && isCrossedEquator == 2)

{

Alert("Sell at : "+TimeToStr(Time[0],TIME_DATE|TIME_SECONDS));

}

}

return(0);

}
 

Привет, mladen, спасибо за внимание. Я вернулся и посмотрел на свои коды и не смог понять, что вы имели в виду под переменной "total". В чем может быть причина моей ошибки?

С уважением,

Терранс

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

//| My_First_EA.mq4 |

//| TK|

//| Торговая платформа MetaTrader 4 / MetaQuotes Software Corp. |

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

#property copyright "TK"

#property link "http://www.metaquotes.net"

//--- входные параметры

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0;

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

//| функция инициализации эксперта |

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

int init()

{

//----

//----

return(0);

}

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

//| функция деинициализации эксперта | |

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

int deinit()

{

//----

//----

return(0);

}

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

//| функция запуска эксперта |

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

дата-время newbar;

int start()

{

if(newbar==Time[0])return(0);

else newbar=Time[0];

int ticket, total;

if(Bars<100)

{

Print("баров меньше 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit меньше 10");

return(0);

}

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

//| функция запуска эксперта | Стохастический триггер

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

// shortStoc = iStochastic(NULL,0,7,15,17,MODE_LWMA,0,MODE_MAIN,0); //оригинальное движение стока

// longStoc = iStochastic(NULL,0,7,15,17,MODE_LWMA,0,MODE_SIGNAL,0); //однородное движение Stoc

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

//| функция запуска эксперта | Установить триггерную сделку только при пересечении линии и закрытии свечи |//.

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

int isCrossed = 0;

double shortStoc1 = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,1);

double longStoc1 = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2 = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,2);

double longStoc2 = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,2);

double diff1 = shortStoc1-longStoc1;

double diff2 = shortStoc2-longStoc2;

if ((diff1*diff2)<0)

{

if (shortStoc1>longStoc1)

isCrossed = 1;

else isCrossed = 2;

}

// Начало экватора -------------------------------------

int isCrossedEquator = 0;

double shortStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN,1);

double longStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN,2);

double longStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,2);

double diff1Equator = shortStoc1Equator-longStoc1Equator;

double diff2Equator = shortStoc2Equator-longStoc2Equator;

if ((diff1Equator*diff2Equator)<0)

{

if (shortStoc1Equator>longStoc1Equator)

isCrossedEquator = 1;

else isCrossedEquator = 2;

}

// Equator Stoc End -------------------------------------

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

//| функция завершения работы эксперта | Установка триггерной сделки только при пересечении линии и закрытии свечи |//.

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

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

//| expert end function | Stochastic Trigger

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

//| expert start function | Триггерный ордер

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

total = OrdersTotal();

if(total < 2) //ограничение количества открытых сделок

{

if(isCrossed == 1 && isCrossedEquator == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"My EA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер BUY : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());

return(0);

}

if(isCrossed == 2 && isCrossedEquator == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Мой советник",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер SELL : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера SELL : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

//| экспертная функция завершения |

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

mladen:
Терранс

Единственное, что я не смог проверить, это переменную "total".

Код должен работать, если переменная total установлена правильно. Вот тестовый индикатор, который я использовал с вашими условиями, и он подает правильные сигналы на покупку и продажу (запустите индикатор в визуальном режиме и вы увидите, когда он подает сигнал), так что ошибка где-то в другом месте.

#property indicator_separate_window

#property indicator_buffers 0

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

return(0);

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int total = 0;

int isCrossedTrigger= 0;

double shortStoc1Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,1);

double longStoc1Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,1) ;

double shortStoc2Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,2);

double longStoc2Trigger = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,2) ;

double diff1Trigger = shortStoc1Trigger-longStoc1Trigger;

double diff2Trigger = shortStoc2Trigger-longStoc2Trigger;

if ((diff1Trigger*diff2Trigger)<0)

{

if (shortStoc1Trigger>longStoc1Trigger)

isCrossedTrigger= 1;

else isCrossedTrigger= 2;

}

int isCrossedEquator = 0;

double shortStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN, 1);

double longStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN, 2);

double longStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,2);

double diff1Equator = shortStoc1Equator-longStoc1Equator;

double diff2Equator = shortStoc2Equator-longStoc2Equator;

if ((diff1Equator*diff2Equator)<0)

{

if (shortStoc1Equator>longStoc1Equator)

isCrossedEquator = 1;

else isCrossedEquator = 2;

}

//

//

//

//

//

if(total < 2)

{

if(isCrossedTrigger== 1 && isCrossedEquator == 1)

{

Alert("Buy at : "+TimeToStr(Time[0],TIME_DATE|TIME_SECONDS));

}

if(isCrossedTrigger== 2 && isCrossedEquator == 2)

{

Alert("Sell at : "+TimeToStr(Time[0],TIME_DATE|TIME_SECONDS));

}

}

return(0);

}
 
tkuan77:
Привет, mladen, спасибо за внимание. Я вернулся и посмотрел на свои коды и не смог понять, что вы имели в виду под переменной "total". В чем может быть причина моей ошибки?

С уважением,

Терранс

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

//| My_First_EA.mq4 |

//| TK|

//| Торговая платформа MetaTrader 4 / MetaQuotes Software Corp. |

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

#property copyright "TK"

#property link "http://www.metaquotes.net"

//--- входные параметры

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0;

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

//| функция инициализации эксперта |

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

int init()

{

//----

//----

return(0);

}

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

//| функция деинициализации эксперта | |

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

int deinit()

{

//----

//----

return(0);

}

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

//| функция запуска эксперта |

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

дата-время newbar;

int start()

{

if(newbar==Time[0])return(0);

else newbar=Time[0];

int ticket, total;

if(Bars<100)

{

Print("баров меньше 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit меньше 10");

return(0);

}

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

//| функция запуска эксперта | Стохастический триггер

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

// shortStoc = iStochastic(NULL,0,7,15,17,MODE_LWMA,0,MODE_MAIN,0); //оригинальное движение стока

// longStoc = iStochastic(NULL,0,7,15,17,MODE_LWMA,0,MODE_SIGNAL,0); //однородное движение Stoc

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

//| функция запуска эксперта | Установить триггерную сделку только при пересечении линии и закрытии свечи |//.

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

int isCrossed = 0;

double shortStoc1 = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,1);

double longStoc1 = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2 = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_MAIN,2);

double longStoc2 = iStochastic(NULL,0,3,5,7,MODE_SMA,0,MODE_SIGNAL,2);

double diff1 = shortStoc1-longStoc1;

double diff2 = shortStoc2-longStoc2;

if ((diff1*diff2)<0)

{

if (shortStoc1>longStoc1)

isCrossed = 1;

else isCrossed = 2;

}

// Начало экватора -------------------------------------

int isCrossedEquator = 0;

double shortStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN,1);

double longStoc1Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,1);

double shortStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_MAIN,2);

double longStoc2Equator = iStochastic(NULL,0,10,100,20,MODE_SMA,0,MODE_SIGNAL,2);

double diff1Equator = shortStoc1Equator-longStoc1Equator;

double diff2Equator = shortStoc2Equator-longStoc2Equator;

if ((diff1Equator*diff2Equator)<0)

{

if (shortStoc1Equator>longStoc1Equator)

isCrossedEquator = 1;

else isCrossedEquator = 2;

}

// Equator Stoc End -------------------------------------

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

//| функция завершения работы эксперта | Установка триггерной сделки только при пересечении линии и закрытии свечи |//.

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

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

//| expert end function | Stochastic Trigger

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

//| expert start function | Триггерный ордер

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

total = OrdersTotal();

if(total < 2) //ограничение количества открытых сделок

{

if(isCrossed == 1 && isCrossedEquator == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"My EA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер BUY : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());

return(0);

}

if(isCrossed == 2 && isCrossedEquator == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"Мой советник",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Открыт ордер SELL : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера SELL : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

//| функция завершения работы эксперта |

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

Терранс

В моих тестах этот советник работает.

Вот результат тестирования и отчет о результатах обратного тестирования. Тестирование проводилось на 1-минутном таймфрейме

Файлы:
tk.zip  16 kb
result.gif  13 kb
 

Привет всем, pls может кто-нибудь помочь мне с этим кодом ниже,,,,it продолжает давать мне звуковое оповещение на каждом тике, а не только когда срабатывают необходимые условия торговли! Я не хочу, чтобы оповещение звучало на каждом тике или когда формируется новая свеча.

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 Lime

#property indicator_color2 Red

//---- входные параметры

extern int ADXbars=14;

extern int CountBars=350;

//---- буферы

double val1[];

double val2[];

double b4plusdi,nowplusdi,b4minusdi,nowminusdi;

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

//| Пользовательская функция деинициализации индикатора |

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

int deinit()

{

//----

//----

return(0);

}

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

//| Пользовательская функция итерации индикатора |

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

int init()

{

//-- Короткое имя индикатора

IndicatorShortName("PipsdatorPro1("+Symbol()+")");

//---- строка индикатора

IndicatorBuffers(2);

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,233);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,234);

SetIndexBuffer(0,val1);

SetIndexBuffer(1,val2);

//----

return(0);

}

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

//| AltrTrend_Signal_v2_2 |

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

int start()

{

if (CountBars>=Bars) CountBars=Bars;

SetIndexDrawBegin(0,Bars-CountBars);

SetIndexDrawBegin(1,Bars-CountBars);

int i,shift,counted_bars=IndicatorCounted();

//---- проверка на возможные ошибки

if(counted_bars<0) return(-1);

//---- начальный ноль

if(counted_bars<1)

{

for(i=1;i<=CountBars;i++) val1[CountBars-i]=0.0;

for(i=1;i<=CountBars;i++) val2[CountBars-i]=0.0;

}

for (shift = CountBars; shift>=0; shift--)

{

b4plusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift-1);

nowplusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift);

b4minusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift-1);

nowminusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift);

if (b4plusdi>b4minusdi && nowplusdi<nowminusdi && i!=1)

{

val1[shift]=Low[shift]-5*Point;

// Alert("Buy Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n",Symbol());

i++;

}

if (b4plusdinowminusdi && i!=1)

{

val2[shift]=High[shift]+5*Point;

// Alert("Стрелка на продажу","\n", "Текущее время ",TimeToStr(CurTime()),"\n",Symbol());

i++;

}

}

return(0);

}

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

 
Mastercash:
Привет всем, pls может кто-нибудь просто помочь мне с этим кодом ниже,,,,it продолжает давать мне звуковое оповещение на каждом тике вместо того, чтобы только когда торговые необходимые условия срабатывают! Я не хочу, чтобы оповещение звучало на каждом тике или когда формируется новая свеча.

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 Lime

#property indicator_color2 Red

//---- входные параметры

extern int ADXbars=14;

extern int CountBars=350;

//---- буферы

double val1[];

double val2[];

double b4plusdi,nowplusdi,b4minusdi,nowminusdi;

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

//| Пользовательская функция деинициализации индикатора |

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

int deinit()

{

//----

//----

return(0);

}

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

//| Пользовательская функция итерации индикатора |

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

int init()

{

//-- Короткое имя индикатора

IndicatorShortName("PipsdatorPro1("+Symbol()+")");

//---- строка индикатора

IndicatorBuffers(2);

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,233);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,234);

SetIndexBuffer(0,val1);

SetIndexBuffer(1,val2);

//----

return(0);

}

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

//| AltrTrend_Signal_v2_2 |

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

int start()

{

if (CountBars>=Bars) CountBars=Bars;

SetIndexDrawBegin(0,Bars-CountBars);

SetIndexDrawBegin(1,Bars-CountBars);

int i,shift,counted_bars=IndicatorCounted();

//---- проверка на возможные ошибки

if(counted_bars<0) return(-1);

//---- начальный ноль

if(counted_bars<1)

{

for(i=1;i<=CountBars;i++) val1[CountBars-i]=0.0;

for(i=1;i<=CountBars;i++) val2[CountBars-i]=0.0;

}

for (shift = CountBars; shift>=0; shift--)

{

b4plusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift-1);

nowplusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift);

b4minusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift-1);

nowminusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift);

if (b4plusdi>b4minusdi && nowplusdi<nowminusdi && i!=1)

{

val1[shift]=Low[shift]-5*Point;

// Alert("Buy Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n",Symbol());

i++;

}

if (b4plusdinowminusdi && i!=1)

{

val2[shift]=High[shift]+5*Point;

// Alert("Стрелка на продажу","\n", "Текущее время ",TimeToStr(CurTime()),"\n",Symbol());

i++;

}

}

return(0);

}

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

Mastercash, есть версия этого индикатора здесь https://www.mql5.com/en/forum/173574/page320 может это поможет.

 
mladen:
Терранс

В моих тестах этот советник работает

Вот результат тестирования плюс отчет об обратном тестировании. Тестирование проводилось на 1-минутном таймфрейме

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

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

Я пытался настроить советник под эти критерии, но не смог добиться желаемых результатов. Может быть, я что-то делаю не так? Пожалуйста, помогите. Еще раз спасибо.

С уважением,

Терранс

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

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

Я пытался настроить советник под эти критерии, но не смог добиться желаемых результатов. Может быть, я что-то делаю не так? Пожалуйста, помогите. Еще раз спасибо.

С уважением,

Терранс

Терранс

Вероятно, для этого вам придется написать собственный индикатор (некоторые вещи в советниках просто невозможно сделать так, как это делают индикаторы).

 
mladen:
Terrance Для этого вам, вероятно, придется написать собственный индикатор (некоторые вещи в советниках вы просто не можете сделать так же, как это делают индикаторы).

Привет, mladen, 1 вещь, которую я не понимаю, это то, почему я могу сделать это с MA, а не с iMA, несмотря на то, что это одинаковые критерии? Может это какие-то настройки индикатора?

С уважением,

Терранс

 
tkuan77:
Привет, mladen, 1 вещь, которую я не понимаю, это то, почему я могу сделать это с MA, а не с iMA, несмотря на то, что это один и тот же тип критериев? Может это какие-то настройки индикатора?

С уважением,

Терранс

потому что с пользовательским индикатором вы можете сохранять состояния (тренды) между двумя тиками, а при использовании iMA вы не можете (только один пример).