Помогите решить избыток сделок

 

Народ, требуется ваша помощь.

Есть торговые условия вида, определены так: Покупать если %D линия стохастика пересекает отметку 30, при этом предыдущий бар должен быть ниже значения 29(получается отметка пересекается снизу вверх). В тестере я задал небольшой временной интервал на часовом тайм фрейме, чтобы посчитать количество сигналов вручную и сравнить с показаниями советника. Дожно получиться 6 сигналов, но советник просто выдает стену текста с сигналами на бай, а в идеале должно быть только 6.


Вот код советника, может кто подскажет что я делаю не правильно?


// Значения торговли
extern double TP = 100;
extern double Lots = 0.1;
extern double SL = 50;
// Значения стохастика
extern int Dperiod = 24;
extern int Kperiod = 3;
extern int Slowing = 6;
extern int St_buy = 30;
extern int St_sell = 70;
int signal;
int ticket;



int Stoch(int st_bars = 0, int st_type = 0){  // 1 параметр - бары, 2 параметр - тип линии.

   int st_result;
   
   if (st_type == 0 || st_type == 1 && st_bars >= 0){
      st_result = iStochastic(NULL,0,Dperiod,Kperiod,Slowing,MODE_SMA,0,st_type,st_bars);
      if (st_result > -1) return(st_result);
   }
   else return(-1);
   
   return(0);
}

int Criterion() // 10 - open buy, 11 - close buy, 20 - open sell, 21 - close sell.
{
   int St_M, St_S;
   St_M = Stoch();
   St_S = Stoch(0,1);
  
   if (St_M >= St_buy && Stoch(1,0) < (St_buy-1)) return(10);
   
   return(0);
}

int start()
{
   if (Criterion() == 10 && AccountFreeMargin() > Lots*5000){
      
    ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid - SL * Point, Ask + TP * Point, "My order #", 16384, 0, Green);
   }
   return(0);
}
 
piratpirat:

Народ, требуется ваша помощь.

Есть торговые условия вида, определены так: Покупать если %D линия стохастика пересекает отметку 30, при этом предыдущий бар должен быть ниже значения 29(получается отметка пересекается снизу вверх). В тестере я задал небольшой временной интервал на часовом тайм фрейме, чтобы посчитать количество сигналов вручную и сравнить с показаниями советника. Дожно получиться 6 сигналов, но советник просто выдает стену текста с сигналами на бай, а в идеале должно быть только 6.


Вот код советника, может кто подскажет что я делаю не правильно?


Перед новым ОрдерSend сделайте перевывчик.
 
paukas:
Перед новым ОрдерSend сделайте перевывчик.

А что нибудь более действенное? Говорю же, должны определяться только 6 сигналов за промежуток времени, а терминал на каждый сигнал выдает целый ворох ордеров.
 
piratpirat:

А что нибудь более действенное? Говорю же, должны определяться только 6 сигналов за промежуток времени, а терминал на каждый сигнал выдает целый ворох ордеров.
// ???????? ????????
extern double TP = 100;
extern double Lots = 0.1;
extern double SL = 50;
// ???????? ??????????
extern int Dperiod = 24;
extern int Kperiod = 3;
extern int Slowing = 6;
extern int St_buy = 30;
extern int St_sell = 70;
int signal;
int ticket;
//==============================================================
extern string     MaxOrders_Desc    =  "если 0 количество одновременно открытых позиций не ограничивается 1-3";
extern int        MaxOrders         =  1;



int Stoch(int st_bars = 0, int st_type = 0){  // 1 ???????? - ????, 2 ???????? - ??? ?????.

   int st_result;
   
   if (st_type == 0 || st_type == 1 && st_bars >= 0){
      st_result = iStochastic(NULL,0,Dperiod,Kperiod,Slowing,MODE_SMA,0,st_type,st_bars);
      if (st_result > -1) return(st_result);
   }
   else return(-1);
   
   return(0);
}

int Criterion() // 10 - open buy, 11 - close buy, 20 - open sell, 21 - close sell.
{
   int St_M, St_S;
   St_M = Stoch();
   St_S = Stoch(0,1);
  
   if (St_M >= St_buy && Stoch(1,0) < (St_buy-1)) return(10);
   
   return(0);
}

int start()
{
   if (Criterion() == 10 && AccountFreeMargin() > Lots*5000){
   //=======================================
   // if (GetOrdersCount(16384, OP_SELL) > 0)CloseSell();
   if(GetOrdersCount(16384, OP_BUY) < MaxOrders || MaxOrders == 0)
    ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid - SL * Point, Ask + TP * Point, "My order #", 16384, 0, Green);
   }
   return(0);
}

//==============================================================
// подсчет кол-ва открытых позиций
int GetOrdersCount(int MagicNumber, int Type){
   int count = 0;
   for(int i = 0; i < OrdersTotal(); i++)   {
      if(OrderSelect(i, SELECT_BY_POS) == false) continue;
      //if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != MagicNumber) continue;
      if(OrderType() == Type)
         count++;
   }
   return (count);
}

После //======================

смотри.

 
costy_:
После //======================

смотри.

То что нужно, спасибо большое! :)
 

как то все странно написано. Всегда умиляет код когда каждую мелочь которая состоит из одной функции отделяют в отдельную функцию

пересечение стохастика линии смотрят так:

StochNow=iStochastic(NULL,0,Dperiod,Kperiod,0,MODE_SMA,0,0,Indicator_Shift);
StochLast=iStochastic(NULL,0,Dperiod,Kperiod,0,MODE_SMA,0,0,Indicator_Shift+1);
if (StochNow>30 && StochLast<=30) //buy
if (StochNow<80 && StochLast>=80) //sell

Также в советнике с симметричными уровнями не советую делать 2 параметра уровней. Т.е. если оптимизация покажет уровни 10 и 75 это будет не корректно- подгон к тренду.

Ставишь в опциях один параметр который отвечает за расстояние до уровней от центра (от 50 для стохастика) и в init рассчитываешь эти уровни на которые будешь ориентироваться.

 
piratpirat:

А что нибудь более действенное? Говорю же, должны определяться только 6 сигналов за промежуток времени, а терминал на каждый сигнал выдает целый ворох ордеров.
Действенней не бывает. Иначе на каждый тик срабатывать будет если условия не изменились.
Причина обращения: