[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 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)

시작 함수에서 정확하게 발생하지만 이러한 변수는 정의되지 않았으며 어딘가에 있지도 않습니다. 더. 시작 하려면 무언가를 추가해야 합니까?

 
hoz :

그건 그렇고, 오류 :

시작 함수에서 정확하게 발생하지만 이러한 변수는 정의되지 않았으며 어딘가에 있지도 않습니다. 더. 시작 하려면 무언가를 추가해야 합니까?

start()에서 정의하고 참조에 의해 호출된 함수 에 전달해야 합니다.
 
Reshetov :
start()에서 정의하고 참조에 의해 호출된 함수에 전달해야 합니다.


이것은 가장 쉬운 옵션입니다. 그러나 한 프로그래머의 기사를 보고 있는데 그의 시작 기능에 아무 것도 선언되어 있지 않습니다.

그의 고문에 대한 링크는 다음과 같습니다.

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

특히 그가 코드를 능숙하게 작성하는 방법에 매우 관심이 있습니다. 따라서 모든 것을 별도의 함수로 작성하는 방법을 배우고 거기에 변수를 선언하지 않고 시작 하는 데 가장 필요한 것만 추가하고 싶습니다.

결국 함수에 대한 참조로 변수를 전달하면 별도의 double이 아닌 전달하는 원래 변수 자체의 버퍼로 작업합니다. 따라서 이전에 어떤 함수에서 선언했는지는 중요하지 않습니다. 안 그래?

 
hoz :


이것은 가장 쉬운 옵션입니다. 그러나 한 프로그래머의 기사를 보고 있는데 그의 시작 기능에 아무 것도 선언되어 있지 않습니다.

함수 외부 에서 정적 변수 를 선언할 수 있으며 참조로 아무 것도 전달할 필요가 없습니다.

호즈 :

결국 함수에 대한 참조로 변수를 전달하면 별도의 double이 아닌 전달하는 원래 변수 자체의 버퍼로 작업합니다. 따라서 이전에 어떤 함수에서 선언했는지는 중요하지 않습니다. 안 그래?

잘못 생각하세요. 변수를 함수 인수로 전달하면 함수 본문에서 선언할 필요가 없습니다. 이미 인수에 선언되어 있습니다. 전달되는 함수를 선언해야 합니다.
 
hoz :


이것은 가장 쉬운 옵션입니다. 그러나 한 프로그래머의 기사를 보고 있는데 그의 시작 기능에 아무 것도 선언되어 있지 않습니다.

그의 고문에 대한 링크는 다음과 같습니다.

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

특히 그가 코드를 능숙하게 작성하는 방법에 매우 관심이 있습니다. 따라서 모든 것을 별도의 함수로 작성하는 방법을 배우고 거기에 변수를 선언하지 않고 시작 하는 데 가장 필요한 것만 추가하고 싶습니다.

결국 함수에 대한 참조로 변수를 전달하면 별도의 double이 아닌 전달하는 원래 변수 자체의 버퍼로 작업합니다. 따라서 이전에 어떤 함수에서 선언했는지는 중요하지 않습니다. 안 그래?


글도 잘썼다

읽다

예, 라인을 변경하십시오.

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

 if (!GetPriceToInput (signal))                                                                                                         
 
Roman. :

이미 Diman이 되면 PERSONAL 캠프를 마스터하시겠습니까? :-)

정말 1년 동안 실생활에서 아직 반죽을 자르지 않았습니까? 같은 곳에서 STARTING 금액이 허약한 당신에게 할당되지 않은 것 같습니까? :-)



곧.
 
Reshetov :

함수 외부에서 정적 변수를 선언할 수 있으며 참조로 아무 것도 전달할 필요가 없습니다.

잘못 생각해. 변수를 함수 인수로 전달하면 함수 본문에서 선언할 필요가 없습니다. 이미 인수에 선언되어 있습니다. 전달되는 함수를 선언해야 합니다.


시작 함수에서 전달하든 다른 함수에서 전달하든 상관없다는 뜻입니다. 또 다른 기능.

이 경우 Double GetPriceToInput(int signal) 함수에서 변수를 선언하고 동일한 double GetPriceToInput(int signal) 함수에서 선언된 priceForSellpriceForBuy 변수를 참조하여 bool Trade(int signal, double& priceForBuy, double& priceForSell)에 전달했습니다. 기능 .

이 함수를 시작 함수에 추가했는데 이미 정의되어 있지 않습니다. 이 문제를 해결하는 방법을 이해하고 싶습니다.

물론 시작할 때 말씀하신 대로 이 2개의 변수를 선언할 수 있지만 이중 GetPriceToInput(int signal) 함수에서 직접 전송할 수도 있습니다 . 그게 내 말이야.

 
hoz :


시작 함수에서 전달하든 다른 함수에서 전달하든 상관없다는 뜻입니다. 또 다른 기능.

이 경우 Double GetPriceToInput(int signal) 함수에서 변수를 선언하고 동일한 double GetPriceToInput(int signal) 함수에서 선언된 priceForSellpriceForBuy 변수를 참조하여 bool Trade(int signal, double& priceForBuy, double& priceForSell)에 전달했습니다. 기능 .

이 함수를 시작 함수에 추가했는데 이미 정의되어 있지 않습니다. 이 문제를 해결하는 방법을 이해하고 싶습니다.

그것들을 어디로 전달했고 전달되지 않은 곳에 값을 할당하는 이유는 무엇입니까?

 
Reshetov :

그것들을 어디로 전달하고 어디에 값을 할당합니까?


글쎄, 나는 double GetPriceToInput(int signal) 함수에서 변수의 값을 얻었다

여기:

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

다음 값을 반환합니다.

 return (priceForSell);
 return (priceForBuy);

저것들. 값은 이미 f-tsiya에서 이러한 변수를 반환했습니다.

그런 다음 bool Trade(int signal, double& priceForBuy, double& priceForSell) 함수를 참조하여 이 값을 보냅니다.

여기 모든 것이 분명합니다!