Советники: Ichimoku

 

Ichimoku:

Советник на основе индикатора Ишимоку. Продаем, если Ichimoku Tenkan-Sen сверху вниз пересекает Ichimoku Kijun-Sen и цена закрытия находится ниже облака Ichimoku. Покупка наоборот.

Author: artem1985

 
Добавляете в код следующую функцию:
  //Посмотрим не открывались ли позы на текущем баре                                    
bool CheckExists(int Type)                                  
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0]
        && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
      Result = False;
    }
  return(Result);
  }
Потом в условие открытия ордера на покупку добавляете
if(/*ваше условие*/ &&CheckExists(OP_BUY))
{ }
В условие на продажу:
if(/*ваше условие*/ && CheckExists(OP_SELL))
 { }
 
Напишите, пожалуйста, код для открытия одного ордера на одной свече
 
В вашем коде насколько понимаю нужно добавить в строчки
   lFlagBuyOpen = (diCustom0<diCustom1 && diCustom2>=diCustom3 && diClose4>diCustom5
                   && diClose6>diCustom7 && CheckExists(OP_BUY));
   lFlagSellOpen = (diCustom8>diCustom9 && diCustom10<=diCustom11 && diClose12<diCustom13
                    && diClose14<diCustom15 && CheckExists(OP_SELL));
 
Спасибо, попробую
 
это работает... Но есть еще одно НО! После закрытия одного ордера, открываются ещё ордера до тех пор, пока выполняются все условия, т.е. на последующих свечах, а надо, чтобы открылся только один ордер
 
artemmaster:
это работает... Но есть еще одно НО! После закрытия одного ордера, открываются ещё ордера до тех пор, пока выполняются все условия, т.е. на последующих свечах, а надо, чтобы открылся только один ордер
Так если есть условие, значит должны открываться ордера:) Наиболее логичным здесь вижу вариант пересмотреть само условие открытия ордера. Например, если это пересечение вверх, то писать "что-то было ниже на пред.баре, а на текущем выше чего-то";) Как-то так.
 
Номер бара открытия int NumberOfBarOpenLastPos()
Необходима для открытия не одном баре не более одного ордера
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -1.    |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    tf  - таймфрейм                 ( 0 - текущий таймфрейм)                |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) {
  datetime oot;
  int      i, k=OrdersTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oot<OrderOpenTime()) oot=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sym, tf, oot, True));
}
 
Donatom:
int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) {
  return(iBarShift(sym, tf, oot, True));
}


Тогда уж и вот эту функцию распиши:
iBarShift()
 
выполнение тика просто можно обрывать на старте и все
int start()
{
//----
//проверка сигнала в баре
if (Time[0] == NowBarsTime)
{
return(0);
}
else
{
NowBarsTime = Time[0];
}
//
}



 
artemmaster, отправил Вам личное сообщение по советнику, чтобы не перегружать форум рисунками.
Причина обращения: