Нужна помощь в написании советника.

 
начал писать советник на основе стохастика, гемороюсь уже неделю!!! видимо что-то координально не правильно делаю!?
за основу взял исходный стохастик из "индикаторов" и пытаюсь в него добавить различные функции торговли. суть в том что я пытаюсь прописать место пересечения стохов, но не могу найти какие показаиели за это отвечают(((
похоже что все это можно сделать в 100 раз проще, но как не догоняю. начал разбираться в уже написаных советниках(самые простые МАКД и МА), но это только усугубило ситуацию! теперь вообще один бордак в голове(((
помогите, кто чем спожет, пожалуйста.
 

Открой код Стохастика. Там есть такие строки:

//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, MainBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, SignalBuffer);
Этот код говорит какие линии рисовать. То есть нам нужно брать значения из массивов MainBuffer и SignalBuffer. Облегчило тебе жизнь? :)
Если же ты используешь не код индикатора, а iCustom, то тогда делай так:
iCustom(NULL, 0, "Stochastic",5,3,3,/*0 или 1, этим значением выбираешь рисуемую линию, т.е. её значение*/,0);
Надеюсь помог :)
ЗЫ: сам недавно начал изучать, поэтому могу в чем-то ошибаться.
 

это понятно! я с с этими массивами и работал! только когда я их преравниваю MainBuffer==SignalBuffer (я хочу сделать чтобы у мея покупка происходила по их пересечению) ни фига не выходит! покупает не по их пересечению а походу от болды((( что нужно приравнять чтобы тем самым определить пересечение стохов?

 
Отрицательный знак величины ( Stoch( Period1, 1 ) - Stoch ( Period2, 1 ) ) * ( Stoch( Period1, 0 ) - Stoch ( Period2, 0 ) ) будет говорить о пересечении между 0 и 1 барами. Исключительный случай, когда эта величина нулевая, придется обрабатывать как-то иначе.
 

Фактически мне нужна вот такая ситуация, прописанная в советнике!






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

int TradeSignal() {
  double stoch2=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_MAIN,2);
  double stoch1=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_MAIN,1);
  int    buysignal=0;
 
  if (st2<20 && st1==st2) buysignal=1;
  return(buysignal);
}

но в итоге он почемуто покупает не при пересечении а при сближеннии и фактическом совпадении! наверно надо как-то подругому это прописать(пересечение). помогите плз.
да кстати, когда меняю MODE_EMA на MOSE_SMA он ваще не покупает ни фига. почему так?

Заранее спасибо!!!

 

cytener писал:
Фактически мне нужна вот такая ситуация, прописанная в советнике!

Такая - это какая? Любое пересечение? Или направление движения тоже важно?

Если просто пересечение сигнальной и главной линий, то код будет примерно такой:
int TradeSignal() 
{
    double stoch_m_1=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_MAIN,1);
    double stoch_m_2=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_MAIN,2);
    double stoch_s_1=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_SIGNAL,1);
    double stoch_s_2=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_SIGNAL,2);
 
    if ( NormalizeDouble( stoch_s_1 - stoch_m_1, Digits ) > 0.0 && 
          NormalizeDouble( stoch_m_2 - stoch_s_2, Digits ) >= 0.0 ) return(1);
 
    return(0);
}


И по поводу "st1==st2" обязательно почитайте:
Сравнение вещественных чисел
И снова о сравнении двух double
О возможности (или нет) сравнения двух double (?)
 

спасиб! читаю ссылки!
нужно пересечение сигнальной и главной линии ниже уровня 20. любое пересечение ниже 20-ого уровня.

 
cytener:

спасиб! читаю ссылки!
нужно пересечение сигнальной и главной линии ниже уровня 20. любое пересечение ниже 20-ого уровня.

ЧТО должно быть ниже уровня 20.0? Основная линия или сигнальная? Или обе?
int TradeSignal() 
{
    double stoch_m_1=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_MAIN,1);
    double stoch_m_2=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_MAIN,2);
    double stoch_s_1=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_SIGNAL,1);
    double stoch_s_2=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_SIGNAL,2);
 
    if ( NormalizeDouble( stoch_s_1 - stoch_m_1, Digits ) > 0.0 && 
          NormalizeDouble( 20.0 - stoch_m_1, Digits ) > 0.0 && 
          NormalizeDouble( 20.0 - stoch_s_1, Digits ) > 0.0 && 
          NormalizeDouble( stoch_m_2 - stoch_s_2, Digits ) >= 0.0 ) return(1);
 
    return(0);
}
 

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

ниже 20 уровня должны быть и сигнальная и основная линии. а еще они пересекаются(тоже находясь ниже 20 уровня).

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

 

cytener писал (а):
ниже 20 уровня должны быть и сигнальная и основная линии. а еще они пересекаются(тоже находясь ниже 20 уровня).

Код, который я выложил, именно это и определяет.

похоже мне несуждено довести этот советник до работающего состояния. (((

Советник - это не только сигнальный блок.
Я бы даже сказал, что сигнальный блок - 10% функциональности эксперта.
Остальное - управление ордерами, торговые функции, и т.п.

Не делаются программы для автоматической торговли "с наскоку". Для тестера, конечно, можно что-то написать, но торговать эксперементальным кодом не советую ;)
 

ну это все ясно!)
просто я в ручную торгуя по своей системе, но хочу ее прогнать на истории по разным периодам! просто последние 2 месяца рынок один и я зарабатываю, а когда рынок поменяется, я начну попадать! и вот чтобы этого не случилось я и пытаюсь свою систему загнать под четкие рамки программы. ну и конечно надо четче определить стопы и тэйк профиты! пока фактически торгую по системе пока профит растет стою, когда начитает убывать крою. а это не правильно. на НАЙСЕ работал, портфели составлял, там все четко было 5-10% делал в месяц. но там я точно знал скока убытка я могу себе позволить и на какой цели крыться. На Форекс сел а тут все подругому.( пока не все на этом рынке понимаю.

//------- Внешние параметры советника --------------------------------
extern string _Parameters_Trade = "----- Параметры торговли";
extern double Lots       = 1;    // Размер торгуемого лота
extern int    StopLoss   = 20;     // Размер фиксированного стопа
extern int    TakeProfit = 40;      // Размер фиксированного тэйка
extern int    Kperiod    = 39;
extern int    Dperiod    = 5;
extern int    slowing    = 5;
extern int    Slippage   = 3;      // Проскальзывание цены
 
extern string _Parameters_Expert = "----- Параметры советника";  
extern color clOpenBuy   = LightBlue;    // Цвет открытия покупки
extern color clOpenSell  = LightCoral;   // Цвет открытия продажи
extern color clCloseBuy  = Blue;         // Цвет закрытия покупки
extern color clCloseSell = Red;          // Цвет закрытия продажи
 
//---- Глобальные переменные советника -------------------------------
int prevTimeBar;
 
void deinit() { Comment(""); }
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  if (prevTimeBar!=Time[0]) OpenPositions();
  prevTimeBar=Time[0];
}
 
//+------------------------------------------------------------------+
//| Открытие позиций                                                 |
//+------------------------------------------------------------------+
void OpenPositions() {
  double ldStop=0, ldTake=0;
  int    bs=GetTradeSignal();
 
  if (!ExistPosition()) {
    if (bs>0) {
      if (StopLoss!=0) ldStop=Ask-StopLoss*Point;
      if (TakeProfit!=0) ldTake=Ask+TakeProfit*Point;
      OpenPosition(OP_BUY, ldStop, ldTake);
    }
    if (bs<0) {
      if (StopLoss!=0) ldStop=Bid+StopLoss*Point;
      if (TakeProfit!=0) ldTake=Bid-TakeProfit*Point;
      OpenPosition(OP_SELL, ldStop, ldTake);
    }
  }
}
 
//+------------------------------------------------------------------+
//| Возвращает торговый сигнал                                       |
//+------------------------------------------------------------------+
int GetTradeSignal() 
{
    double stoch_m_1=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_MAIN,1);
    double stoch_m_2=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_MAIN,2);
    double stoch_s_1=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_SIGNAL,1);
    double stoch_s_2=iStochastic(NULL,15,Kperiod,Dperiod,slowing,MODE_EMA,0,MODE_SIGNAL,2);
 
    if ( NormalizeDouble( stoch_s_1 - stoch_m_1, Digits ) == 0.0 && 
          NormalizeDouble( 20.0 - stoch_m_1, Digits ) >= 0.0 && 
          NormalizeDouble( 20.0 - stoch_s_1, Digits ) >= 0.0 && 
          NormalizeDouble( stoch_m_2 - stoch_s_2, Digits ) == 0.0 ) return(1);
 
    
}
//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции по номеру                  |
//+------------------------------------------------------------------+
bool ExistPosition() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) return(True);
      }
    }
  }
  return(False);
}
 
//+------------------------------------------------------------------+
//| Открытие позиции                                                 |
//| Параметры:                                                       |
//|   op     - операция                                              |
//|   ldStop - уровень стоп                                          |
//|   ldTake - уровень тейк                                          |
//+------------------------------------------------------------------+
void OpenPosition(int op, double ldStop, double ldTake) {
  color  clOpen;
  double pp;
 
  if (op==OP_BUY) {
    clOpen=clOpenBuy; pp=Ask;
  } else {
    clOpen=clOpenSell; pp=Bid;
  }
  pp=NormalizeDouble(pp, Digits);
  OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,"",0,0,clOpen);
}
//+------------------------------------------------------------------+
komposter посмотри плз. то что я написал. вроде все правильно, но после того как изменения внес ваще не покупает(((. не понимаю почему.

на bs<0 не смотри, функциэ под этот параметр хотел позже вставить, но т.к. даже в таком варианте не работает, то пака забил на нее.
Причина обращения: