Мой первый советник на Stochastic. Помогите!

 
Здравствуйте уважаемые профи программирования,

от программирования я далек, но заинтересовался я тут на досуге в пятницу, этим нелегким делом.
Прочитал учебник MQL4, пробежался по справочнику MQL4, нашел подходящего готового советника https://www.mql5.com/ru/code/8942 и пробую теперь подогнать его под свои нужды.
В реале рядом - никого, кто мог бы мне разложить по полочкам всю эту кухню, а одному по-быстрому, только по-книжкам освоить программинг не получается... Вот обращаюсь к вам за помощью. Покажите пожалуйста ошибки, разъясните их сущность и помогите там, где вообще не понимаю :)

Заранее благодарю всех откликнувшихся.

Итак, исходные данные:

.................................................................................................................................

Инструмент: Ger30Jun09
Индикатор: Stochastic 14,3,3; Цены: Low/High; Метод МА: Simple
Расчетное время: H1
Размер лота: 0.05

Ордер Покупка Открытие: если линия К > линии D на 5 от точки пересечения
Ордер Покупка Закрытие: если линия K = линии D

Ордер Продажа Открытие: если линия К < линии D на 5 от точки пересечения
Ордер Продажа Закрытие: если линия K = линии D

Стоп Лосс: -69% от суммы счета (Account Balance)
..................................................................................................................................

Вот, что у меня получается на сегодняшний день:

//+------------------------------------------------------------------+
//|                                              ytg_Multi_Stoch.mq4 |
//|                                   Copyright © 2009, Yuriy Tokman |
//|                                            yuriytokman@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Yuriy Tokman"
#property link      "yuriytokman@gmail.com"

extern bool	Use_Symbol1	= true;
extern string	Symbol1		= "Ger30Jun09";

//+------------------------------------------------------------------+
//| Описание: Ставим Stop Loss 69% от суммы баланса                  |
//+------------------------------------------------------------------+
extern double	X 		= AccountBalance()
extern int	Y 		= 100
extern int	Z		= 69
extern int	StopLoss	= X/Y*Z			// вроде так и вроде здесь

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (Use_Symbol1==true) OpenSymbol(Symbol1); // Для Ger30Jun09
//----
   return(0);
  }

//+----------------------------------------------------------------------------+
//|  Автор    : Юрий Токмань ,  yuriytokman@gmail.com                          |
//+----------------------------------------------------------------------------+
//|  Описание : Возвращает торговый сигнал                                     |
//+----------------------------------------------------------------------------+
 
int GetSignal(string vSymbol)
   {
    double Stoch_Main_0 =iStochastic(vSymbol,60,14,3,3,MODE_SMA,0,MODE_MAIN,0);
    double Stoch_Main_1 =iStochastic(vSymbol,60,14,3,3,MODE_SMA,0,MODE_MAIN,1);
    double Stoch_Sign_0 =iStochastic(vSymbol,60,14,3,3,MODE_SMA,0,MODE_SIGNAL,0);    
    double Stoch_Sign_1 =iStochastic(vSymbol,60,14,3,3,MODE_SMA,0,MODE_SIGNAL,1);    
    
    int vSignal = 0;
    
    if (Stoch_Main_0<20&&Stoch_Main_1<Stoch_Sign_1&&Stoch_Main_0>Stoch_Sign_0) // не знаю, как описать мои исходные данные
    
    vSignal =+1;//up
 
    else 
    if (Stoch_Main_0>80&&Stoch_Main_1>Stoch_Sign_1&&Stoch_Main_0<Stoch_Sign_0) // не знаю, как описать мои исходные данные
    
    vSignal =-1;//down
          
    return (vSignal);
   }
//+----------------------------------------------------------------------------+
//|  Автор    : Юрий Токмань ,  yuriytokman@gmail.com                          |
//+----------------------------------------------------------------------------+
//|  Описание : Открытие позиций                                               |
//+----------------------------------------------------------------------------+
 int OpenSymbol(string vSymbol)
   {
    double point = MarketInfo(vSymbol,MODE_POINT);   
    double bid   = MarketInfo(vSymbol,MODE_BID);
    double ask   = MarketInfo(vSymbol,MODE_ASK);
      
    if(!ExistPositions(vSymbol))
     {
   2
      if(GetSignal(vSymbol)==1)
    
      OrderSend(vSymbol,OP_BUY,0.05,ask,3,Bid-StopLoss,0,666,0,Green); // кажется Стоп Лосс не правильно воткнул и зачем нужен этот магический номер...
     	Alert (GetLastError());					         // Сообщение об ошибке

      if(GetSignal(vSymbol)==-1)
          
      OrderSend(vSymbol,OP_SELL,0.05,bid,3,Bid-StopLoss,0,666,0,0,Red); // кажется Стоп Лосс не правильно воткнул и зачем нужен этот магический номер...
     	Alert (GetLastError());						  // Сообщение об ошибке

     }   
   }

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 

Вот это точно неправильно

extern double X = AccountBalance()
extern int Y = 100
extern int Z = 69
extern int StopLoss = X/Y*Z // вроде так и вроде здесь

Надо бы хотя бы ставить точку с запятой. И убрать extern. Расчеты перенести в init()

 
Vinin >>:

Вот это точно неправильно

Надо бы хотя бы ставить точку с запятой. И убрать extern. Расчеты перенести в init()

про точку с запятой спасибо! :), а почему убрать extern?

 
skunk писал(а) >>

про точку с запятой спасибо! :), а почему убрать extern?

По Y и Z можно оставить. А расчеты нужно перенести хотя бы в init().

 
skunk >>:

про точку с запятой спасибо! :), а почему убрать extern?

по крайней мере

double X = AccountBalance();

int StopLoss = X/Y*Z; 

 т.к . эти параметры неизвестные и их нужно рассчитать!

 

skunk писал(а) >>Покажите пожалуйста ошибки, разъясните их сущность .......

//|  Описание : Открытие позиций                                               |
//+----------------------------------------------------------------------------+
 int OpenSymbol(string vSymbol)
   {
    double point = MarketInfo(vSymbol,MODE_POINT);   
    double bid   = MarketInfo(vSymbol,MODE_BID);
    double ask   = MarketInfo(vSymbol,MODE_ASK);
      
    if(!ExistPositions(vSymbol))
     {
   2
      if(GetSignal(vSymbol)==1)
    
      OrderSend(vSymbol,OP_BUY,0.05,ask,3,ask-StopLoss*point,ask+TakeProfit*point,NULL,666,0,Green); // кажется Стоп Лосс не правильно воткнул и зачем нужен этот магический номер...
     	Alert (GetLastError());					         // Сообщение об ошибке

      if(GetSignal(vSymbol)==-1)
          
      OrderSend(vSymbol,OP_SELL,0.05,bid,3,bid+StopLoss*point,bid-TakeProfit*point,NULL,666,0,Red); // кажется Стоп Лосс не правильно воткнул и зачем нужен этот магический номер...
     	Alert (GetLastError());						  // Сообщение об ошибке

     }   
   }

так будет корректней, т.к. у тебя используется определенный инструмент, плюс забыл умножить на point

Нет условия закрытия прибыльных позиций. желательно добавить TakeProfit  и вынести в extern.

 

По поводу уровней стопов и профитов. ask-StopLoss*point,ask+TakeProfit*point и bid+StopLoss*point,bid-TakeProfit*point

лучше заменить на следующее:

OrderSend(vSymbol,OP_BUY,0.05,ask,3,SLB,TPB,NULL,666,0,Green),

OrderSend(vSymbol,OP_SELL,0.05,bid,3,SLS,TPS,NULL,666,0,Red);

так как если стоп или профит указать равным нулю - будет ошибка.

И соответственно чуть выше добавить следующие кусочки.

double ModeStopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); //Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах.

 //////////////////////////////////////////////////////////////////////////////////////////////////
double TSBuy() /////////// определение уровней TP и SL для BUY ///////////
//////////////////////////////////////////////////////////////////////////////////////////////////
  {
  if(TakeProfit>ModeStopLevel>0) TPB=NormalizeDouble(Ask + TakeProfit*ModePoint,Digits);
  else TPB = 0.0;
  if(StopLoss>ModeStopLevel>0) SLB =NormalizeDouble(Ask - StopLoss*ModePoint,Digits);
  else SLB = 0.0; 
  }
//------------------------------------------------------------------------------------------------

//////////////////////////////////////////////////////////////////////////////////////////////////
double TSSell() /////////// определение уровней TP и SL для SELL ///////////
//////////////////////////////////////////////////////////////////////////////////////////////////  
  {
  if(TakeProfit>ModeStopLevel>0) TPS=NormalizeDouble(Bid - TakeProfit*ModePoint,Digits);
  else TPS =0.0;
  if(StopLoss>ModeStopLevel>0) SLS=NormalizeDouble(Bid + StopLoss*ModePoint,Digits);
  else SLS = 0.0;
  }
//-

 

ни как не пойму, как описывается условие: если K>D на 5, то ...(покупать).


У меня получается только это:

if (iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_MAIN,0)>iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_SIGNAL,0));

vSignal =+1; //up
 
if (iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_MAIN,0)<iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_SIGNAL,0));

vSignal =-1;//down

if (iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_MAIN,0)==iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_SIGNAL,0));
 
vSignal =0; //close

а где и как вставлять "на 5" ???

 
ну так, что... нет ни у кого желания помочь?
 

Может быть, попробовать вот так:

if ( (iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_SIGNAL,0)
      -iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_MAIN,0)) >5)
//покупка
vSignal_BUY =true; else vSignal_BUY=false;
//----------------------------
if ( (iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_MAIN,0)
      -iStochastic(NULL,60,14,3,3,MODE_SMA,0,MODE_SIGNAL,0)) >5)
//продажа
vSignal_SELL =true; else vSignal_SELL=false;

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

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

 

Вы наберите в поиске стохастик. По этому индюку много материала и примеров кода.. 

Напр. вот тут 'Индикатор Стохастик. Любопытное наблюдение.'

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