[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 511

 
hoz:


Sì, mi sono sbagliato. In generale. Se è chiaro qui, l'ordine pendente è impostato solo dal prezzo.

Ecco il codice:

La questione è essenzialmente non complicata. Ho passato parametri formali priceForBuy e priceForSell alla funzione Trade(int signal, double& priceForBuy, double& priceForSell). I parametri sono passati dai link. Non si fa così? Le funzioni sono locali, non globali.

Si è verificato un errore durante la compilazione:

Da dove viene l'errore? Ho già definito questi parametri nella funzioneGetPriceToInput().

Le variabili priceForBuy e priceForSell non sono state trovate - il compilatore dice. Dovete capire come passare i valori delle variabili per riferimento.
 
hoz:

Come potrebbe essere altrimenti? Dovete calcolare la stessa cosa più e più volte per 100 volte?

Rendete il segnale parte dell'esperto, come nel libro di testo, e sarete felici!

Vi ho dato tutti i link nel thread di prima...


 
hoz:

Come potrebbe essere altrimenti? Devi calcolare la stessa cosa 100 volte?
L'idea è GIUSTA, l'attuazione è CROSS! :)))
 

Beh, qui non ci sono esempi concreti:

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

È scritto in cima dove i parametri della funzione sono come i miei, cioè & dopo il tipo di dati.

 
hoz:

Beh, qui non ci sono esempi concreti:

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

È scritto in cima dove i parametri della funzione sono come i miei, cioè & dopo il tipo di dati.

Forse si compilerà in questo modo:

//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
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);
}

anche se la struttura del codice è un po' "sinistra"...

 
TarasBY:

Forse si compilerà in questo modo:

anche se la struttura del codice è un po' "sinistra"...


Beh... sono stato io a scriverlo. Canta il primo scoop. :)
 

Ho riscritto un po' l'esperto. Questo è quello che è venuto fuori:

//+------------------------------------------------------------------+
//|                                                       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);
}

 

A proposito, l'errore:

'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)

avviene esattamente nella funzione diinizio queste variabili non sono definite, non da qualche altra parte. Quindi bisogna aggiungere qualcosa per iniziare?

 
hoz:

A proposito, l'errore:

avviene esattamente nella funzione diinizio queste variabili non sono definite, non da qualche altra parte. Quindi bisogna aggiungere qualcosa per iniziare?

Devono essere definiti in start() e passati alla funzione chiamata per riferimento.
 
Reshetov:
Devono essere definiti in start() e passati per riferimento alla funzione che chiamiamo.


Questo è il modo più semplice. Ma sto guardando gli articoli scritti da un programmatore e non c'è niente di definito nella funzione start().

Ecco un link al suo consulente:

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

In particolare, sono molto interessato a come scrive il codice in modo intelligente. Quindi, voglio imparare a scrivere tutto in funzioni separate, e aggiungere solo l'essenziale periniziare senza dichiarare variabili lì.

Se passiamo una variabile per riferimento in una funzione, stiamo lavorando con un buffer della variabile originale, non con il suo doppio separato. Questo significa che non importa in quale funzione l'abbiamo dichiarato in precedenza. Non è vero?

 
hoz:


Questa è la variante più semplice. Ma sto osservando gli articoli scritti da un programmatore e nella sua funzione di avvio non viene dichiarato proprio nulla.

Potete dichiarare una variabile statica al di fuori delle funzioni e poi non dovrete passare nulla per riferimenti.

hoz:

Se passiamo una variabile per riferimento in una funzione, stiamo lavorando con un buffer della variabile iniziale stessa che passiamo invece del suo duplicato separato. Questo significa che non importa in quale funzione l'abbiamo dichiarato in precedenza. Non è vero?

Non stai pensando correttamente. Se passate una variabile come argomento a una funzione, non dovete dichiararla al corpo della funzione - è già dichiarata nell'argomento. Dovete dichiarare la funzione da cui viene passata.