[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 511

 
hoz:


是的,我错了。一般来说。如果这里很清楚,挂单只按价格设置。

下面是代码。

这个问题本质上并不复杂。我向Trade(int signal, double& priceForBuy, double& priceForSell) 函数传递正式参数priceForBuypriceForSell 。参数是由链接传递的。不是这样做的吗?这些功能是局部的,不是全局的。

编译过程中发生了一个错误。

错误是从哪里来的?我已经在GetPriceToInput() 函数中定义了这些参数。

没有找到priceForBuy和priceForSell的变量--编译器说。你需要弄清楚如何通过引用来传递变量的值。
 
hoz:

不然怎么会这样呢?你必须把同一件事反复计算100次吗?

让信号成为专家的一部分,就像教科书上说的那样,你会很高兴的!

我在前面的主题中给了你所有的链接...


 
hoz:

不然怎么会这样呢?你必须把同样的事情计算100次吗?
想法是对的,实施是错的!:)))
 

嗯,这里没有具体的例子。

https://docs.mql4.com/ru/basis/variables/formal

它写在像我这样的函数参数的顶部,即&在数据类型的 后面。

 
hoz:

嗯,这里没有具体的例子。

https://docs.mql4.com/ru/basis/variables/formal

它写在像我这样的函数参数的顶部,即&在数据类型之后。

也许它能以这种方式进行编译。

//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
bool GetPriceToInput (int signal)
{
  firstBarClosed = iClose(Symbol(),1440,2);
  secondBarClosed = iClose(Symbol(),1440,1);

    double deltaForSell = (firstBarClosed - secondBarClosed)/2;
    double priceForSell = secondBarClosed - deltaForSell;


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

  return(0);
}

尽管代码结构有点 "左撇子"...

 
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()中定义,并通过引用传递给我们调用的函数。


这是最简单的方法。但我在看一个程序员写的文章,start()函数中根本没有定义。

这里有他的顾问的链接。

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

特别是,我对他如何智能地写代码非常感兴趣。所以,我想学习如何把所有的东西都写在独立的函数中,只添加精华部分开始,而不在那里声明变量。

如果我们将一个变量通过引用传递到一个函数中,我们是在用原始变量的缓冲区工作,而不是用其单独的双倍数。这意味着我们之前在哪个函数中声明它并不重要。不是吗?

 
hoz:


这是最简单的变体。但我在观察一个程序员写的文章,他的启动 函数中根本没有声明什么。

你可以在函数之外声明一个静态变量,然后你就完全不必通过引用来传递任何东西。

hoz:

如果我们将一个变量通过引用传递到一个函数中,我们是在用我们传递的初始变量本身的缓冲区工作,而不是其单独的副本。这意味着我们之前在哪个函数中声明它并不重要。不是吗?

你的想法不正确。如果你把一个变量作为参数传递给一个函数,你不需要向函数主体声明它--它已经在参数中声明了。你必须声明它所传递的函数。