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

 
rigonich:
Si fa prima sl = 0; tp = 0; e poi if(sl != 0 || tp != 0).


Vitaly, il punto è chiaro. Guarda:

void OrdersModifying(double& sl, double& tp)
{
  int total = OrdersTotal() - 1;
  sl = 0; tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

All'inizio sl = 0; tp = 0; Poi trovo i valori normalizzati di sl e tp che saranno già nell'ordine in base a i_sl e i_tp inseriti dall'utente. E poi controllo sesl etp non sono uguali a zero, cioè sono cambiati dopo che li ho dichiarati all'inizio della funzione, quindi modifichiamo l'ordine.

E sesl etp sono uguali a zero, significa che questi parametri non sono stati calcolati... come ho capito. Una volta ottenuti i valori di queste variabili, essi diventeranno immediatamente non nulli, e potremo modificare l'ordine... Ha senso?

 
hoz:


Vitaly, il punto è chiaro. Vedere:

All'inizio sl = 0; tp = 0; Poi in base ai valori i_sl e i_tp inseriti dall'utente trovo i valori normalizzati di sl e tp che saranno già nell'ordine. E poi controllo sesl etp non sono uguali a zero, cioè sono cambiati dopo che li ho dichiarati all'inizio della funzione, quindi modifichiamo l'ordine.

E sesl etp sono uguali a zero, significa che questi parametri non sono stati calcolati... come ho capito. Una volta ottenuti i valori di queste variabili, essi diventeranno immediatamente non nulli, e potremo modificare l'ordine... Ha senso?



Scusa, non ho visto qualcosa, niente occhiali e niente colore, ma perché passare dei parametri a questa funzione, e anche per riferimento? Se i_sl,g_type... sono variabili globali, funzionerà senza parametri, e se avete bisogno di cambiarle (variabili dopo la modifica), fatelo nella stessa funzione dopo la modifica.
 
rigonich:

Scusa, non ho visto qualcosa, non ho gli occhiali o qualche colore, ma perché dovremmo passare dei parametri in questa funzione, e anche per riferimento? Se i_sl,g_type... sono variabili globali, funzionerà senza parametri, e se avete bisogno di cambiarle (variabili dopo la modifica), fatelo nella stessa funzione dopo la modifica.


Gli ordini sono inviati dalle funzioniOpenBuy() eOpenSell(), ma la funzioneOrdersModifying()modifica gli ordini

Cioè se, per esempio, la funzione di modifica è posta nella funzioneTrade (segnale int) oOpenBuy() eOpenSell(), allora i valori sl e tp ottenuti nella funzioneOrdersModifying() dovrebbero essere passati lì comunque.Questi valori mancano in questa funzione.

 
hoz:


Gli ordini sono inviati dalle funzioniOpenBuy() eOpenSell(), ma sono modificati dalla funzioneOrdersModifying()

Cioè se, per esempio, la funzione di modifica è posta nella funzioneTrade (segnale int) oOpenBuy() eOpenSell(), allora i valori sl e tp ottenuti nella funzioneOrdersModifying() dovrebbero essere passati lì comunque.Questi valori mancano in questa funzione.


Nel vostro caso, le funzioniOpenBuy() eOpenSell() piazzano ordini senza std e poi, se gli ordini sono piazzati, vengono modificati utilizzando la funzioneOrdersModifying() . Non vedo la necessità di mettere da qualche altra parte la funzioneOrdersModifying() e passarci dei parametri. Avetesolo bisogno di dichiarare levariabili sl e tp in questa funzione. int sl = 0, tp = 0;

Scusa, non int, un doppio.

 
rigonich:

Le funzioniOpenBuy() eOpenSell() piazzano ordini senza sl e così via, e poi, se gli ordini vengono piazzati, vengono modificati utilizzando la funzioneOrdersModifying() . Non vedo la necessità di mettere da qualche altra parte la funzioneOrdersModifying() e passarci dei parametri. Avetesolo bisogno di dichiarare levariabili sl e tp in questa funzione. int sl = 0, tp = 0;


Al momento ho una tale funzione di trading:

bool Trade (int signal)
{
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу
  
  if(OrderStopLoss() == 0 && OrderTakeProfit() == 0)
    OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    
  if(UseBU == true)
     MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

La modifica non ha luogo.

 
hoz:


Al momento ho una tale funzione di trading:

La modifica non ha luogo.


Hai un ordine non selezionato nella funzione Trade ().
 
rigonich:

Non capisco cosa vuoi dallo script.


Avete bisogno di un programma che, quando viene lanciato nei grafici dell'archivio

Le sezioni del movimento dei prezzi saranno contrassegnate visivamente con i parametri specificati in termini di forza e tempo del movimento.

Per esempio - una correzione di 400 punti fatta in 30 minuti. E così per tutto l'anno, tutte le correzioni all'interno di questo intervallo.

È impossibile osservarli visivamente manualmente. Distorsioni. Mi piacerebbe avere una codifica a colori che permetta di vederli subito.

___

Ho cercato, ci sono diversi programmi "Histoty". Ma visualizzano solo la storia dell'account.

Ma non ho trovato un segmento del prezzo secondo i filtri che ho specificato.

 
rigonich:

Non hai un ordine selezionato nella funzione Trade ().


Esiste una cosa del genere. Ecco la soluzione.

bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу
       
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }
  }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

E la funzione di modifica è questa:

void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

Strano Ma non ci sono fermate e prese sull'uscita di nuovo.

 
TUNGUS:


Abbiamo bisogno di un programma che, quando viene lanciato nei grafici dell'archivio

Le sezioni del movimento dei prezzi saranno contrassegnate visivamente con i parametri specificati in termini di forza e tempo del movimento.

Per esempio - una correzione di 400 punti fatta in 30 minuti. E così per tutto l'anno, tutte le correzioni all'interno di questo intervallo.

È impossibile osservarli visivamente manualmente. Distorsioni. Mi piacerebbe avere una codifica a colori che permetta di vederli subito.

___

Ho cercato, ci sono diversi programmi "Histoty". Ma visualizzano solo la storia dell'account.

Ma non ho trovato un segmento del prezzo secondo i filtri che ho impostato.


History, History_Draw - funzionano come Expert Advisors nei test.

Ho bisogno di qualcosa del genere, per guardare le correzioni nella storia secondo i parametri dati.

 

Problema con Symbol() MT4:

2 funzioni da illustrare:

string   SymbolOK()
{

   string   value;
   string   argument = "ANYTHING";

   if(false)
   {
      value = argument;
   }

   return(value);

}

string   SymbolPROBLEM()
{

   string   value;
   string   argument = Symbol();

   if(false)
   {
      value = argument;
   }

   return(value);

}

L'esecuzione del primo produce una stringa vuota:

int start()
{
   Comment(SymbolOK());
   return(0);
}

Ma la seconda funzione produce una stringa ID "EURUSD" (beh, dipende dal grafico, ma produce, anche se secondo la logica della funzione dovrebbe essere una stringa vuota):

int start()
{
   Comment(SymbolPROBLEM());
   return(0);
}

Aiutatemi a capire cosa c'è che non va? Grazie