[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 514

 
TarasBY:

Может так будет компилироваться: 

 хотя структура код какая-то "левая"...


 Ну.. это ж я писал. Пой первый совок. :)
 

 Я переписал чутка эксперт. Вот что вышло:

 

//+------------------------------------------------------------------+
//|                                                       2 Days.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string    A1 = "Объем сделки. Если i_lots = 0, то считается в процентах";
extern double    i_lots = 0.1;
extern string    A2 = "Управление рисками";
extern double    i_sl = 15,
                 i_tp = 10;
extern int  slippage,
            price_b,
            price_a;

extern string    Z1 = "=== Прочие настройки ===";
extern string    i_openOrderSound = "ok.wav";
extern int       i_magicNumber = 400021;

double firstBarClosed,
       secondBarClosed;
 
// Идентификаторы типов сигналов
#define SIGNAL_BUY              1                     // Сигнал на покупку
#define SIGNAL_SELL            -1                     // Сигнал на продажу
#define SIGNAL_NO               0                     // Нет сигнала

#include <stderror.mqh>

//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации эксперта                                                     |
//+-------------------------------------------------------------------------------------+
int init()
{
   
   return(0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации эксперта                                                     |
//+-------------------------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal, double& priceForBuy, double& priceForSell)
{
 // FindOrders();
  priceForBuy = NormalizeDouble(priceForBuy,Digits);
  priceForSell = NormalizeDouble(priceForSell,Digits);
  
  if (signal == SIGNAL_BUY)
     if (!OrderSend(Symbol(),OP_BUYLIMIT, i_lots,priceForBuy,slippage,i_sl,i_tp,"",i_magicNumber,3))
     return(false);
     
  if (signal == SIGNAL_SELL)
     if (!OrderSend(Symbol(),OP_SELLLIMIT,i_lots,priceForSell,slippage,i_sl,i_tp,"",i_magicNumber,3))
     return(false);
     
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
double GetPriceToInput(int signal)
{
  firstBarClosed = iClose(Symbol(),1440,2);
  secondBarClosed = iClose(Symbol(),1440,1);
    
  double deltaForSell = (firstBarClosed - secondBarClosed)/2;
  double priceForSell = secondBarClosed - deltaForSell;
    
//  return(priceForSell);

  
  double deltaForBuy = (secondBarClosed - firstBarClosed)/2;
  double priceForBuy = secondBarClosed + deltaForBuy;  
  return(Trade(signal, priceForBuy, priceForSell));
}
//+-------------------------------------------------------------------------------------+
//| Генерация сигнала закрытия, покупки или продажи                                     |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
  if(firstBarClosed > secondBarClosed)
  return(SIGNAL_BUY);

  if(firstBarClosed < secondBarClosed)
  return(SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция Start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
  int signal = GetSignal();
    
    if (signal != SIGNAL_NO)
      if(!Trade(signal, priceForBuy, priceForSell))
      return(0);

  return(0);
}

 

  Кстати, ошибка:

'priceForBuy' - variable not defined    E:\Insall'd soft's\Forex\Admiral Markets\experts\2 Days.mq4 (103, 25)
'priceForSell' - variable not defined   E:\Insall'd soft's\Forex\Admiral Markets\experts\2 Days.mq4 (103, 38)

 возникает именно в функции start не определены переменные эти, а не где-н. ещё. Значит что-то в start нужно добавить?

 
hoz:

 

  Кстати, ошибка:

 возникает именно в функции start не определены переменные эти, а не где-н. ещё. Значит что-то в start нужно добавить?

В start() их нужно определить, а в вызываемую функцию передавать по ссылке.
 
Reshetov:
В start() их нужно определить, а в вызываемую функцию передавать по ссылке.


 Это самый простой вариант. Но я вот наблюдаю за статьями одного программиста, и у него в функции start ничего не объявляется вообще.

 Вот ссылка на его советник:

 http://www.forextrade.ru/media/Image/MQLabs/181_ag/ChannelByMACross_Expert.mq4 

 В частности, мне очень интересно, как он грамотно пишит коды. Поэтому, хочется научится писать всё отдельными функциями, а в start добавлять только самое необходимое без объявления там переменных.

 Ведь если мы передаём в функцию переменную по ссылке, то мы работает с буфером самой исходной переменной, которую передаём, а не с отдельным её дублем. А значит не важно, в какой функции до этого мы её объявили. Разве не так? 

 
hoz:


 Это самый простой вариант. Но я вот наблюдаю за статьями одного программиста, и у него в функции start ничего не объявляется вообще.

Можно объявить статическую переменную вне функций и тогда вообще ничего передавать по ссылкам не придется.

hoz:

 

 Ведь если мы передаём в функцию переменную по ссылке, то мы работает с буфером самой исходной переменной, которую передаём, а не с отдельным её дублем. А значит не важно, в какой функции до этого мы её объявили. Разве не так? 

Неправильно мыслите. Если вы передаете переменную в качестве аргумента функции, то теле функции ее объявлять не надо - она уже объявлена в аргументе. Объявлять функцию нужно там, откуда она передается.
 
hoz:


 Это самый простой вариант. Но я вот наблюдаю за статьями одного программиста, и у него в функции start ничего не объявляется вообще.

 Вот ссылка на его советник:

 http://www.forextrade.ru/media/Image/MQLabs/181_ag/ChannelByMACross_Expert.mq4 

 В частности, мне очень интересно, как он грамотно пишит коды. Поэтому, хочется научится писать всё отдельными функциями, а в start добавлять только самое необходимое без объявления там переменных.

 Ведь если мы передаём в функцию переменную по ссылке, то мы работает с буфером самой исходной переменной, которую передаём, а не с отдельным её дублем. А значит не важно, в какой функции до этого мы её объявили. Разве не так? 


Он также грамотно написал   

почитай

Да, поменяй строчку  

if(!Trade(signal, priceForBuy, priceForSell))

 на   

if(!GetPriceToInput (signal))                                                                                                         
 
Roman.:

Когда уже Диман, ты осилишь ЛИЧНЫЙ камп?  :-)

Неужели за год на реале ещё бабла не нарубил? Там же вроде и СТАРТОВЫЕ суммы тебе не хилые выделены?  :-)



сКОРО.
 
Reshetov:

Можно объявить статическую переменную вне функций и тогда вообще ничего передавать по ссылкам не придется.

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


 Я имел ввиду не важно передаём мы из функции start  или из какой-н. другой функции.

 В данном случае я объявил переменные в функции  double GetPriceToInput(int signal) и передал по ссылке объявленнные в этой же функции double GetPriceToInput(int signal) переменные priceForSell и priceForBuy в функцию bool Trade(int signal, double& priceForBuy, double& priceForSell).

 Данную функцию я добавил в функцию start и вижу, что там они уже неопределены. Хочу понять как это исправить.

 Конечно, можно объявить эти 2 переменные как вы сказали, в start сразу, но можно же их непосредственно из функции double GetPriceToInput(int signal) передать их. Вот что я имею ввиду.

 
hoz:


 Я имел ввиду не важно передаём мы из функции start  или из какой-н. другой функции.

 В данном случае я объявил переменные в функции  double GetPriceToInput(int signal) и передал по ссылке объявленнные в этой же функции double GetPriceToInput(int signal) переменные priceForSell и priceForBuy в функцию bool Trade(int signal, double& priceForBuy, double& priceForSell).

 Данную функцию я добавил в функцию start и вижу, что там они уже неопределены. Хочу понять как это исправить.

Куда Вы их передали и зачем присваиваете значения там, куда их не передавали?

 
Reshetov:

Куда Вы их передали и где Вы им присваиваете значения?


 Ну я же получил значения переменных в функции double GetPriceToInput(int signal)

 Вот:

double priceForSell = secondBarClosed - deltaForSell;
double priceForBuy = secondBarClosed + deltaForBuy;

 Возвращаю эти значения:

return(priceForSell);
return(priceForBuy);

 Т.е. значения уже ф-ция вернула этих переменных.

 Дальше я эти значения по ссыле посылаю в ф-цию bool Trade(int signal, double& priceForBuy, double& priceForSell)

 Тут же всё очевидно!

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