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

 
rigonich:

Non hai un ordine selezionato nella funzione Trade ().

A proposito. Che senso ha selezionare un ordine nella funzione Trade()? Sto chiamando la funzione OrdersModifying() dove l'ordine è selezionato e viene modificato lì. Cioè, la variante iniziale era corretta!
 
hoz:


Esiste una cosa del genere. Ecco la soluzione.

E la funzione di modifica è qui:

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



OrderSelect(g_ticket,SELECT_BY_TICKET) prima della linea if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
 
TUNGUS:


History, History_Draw - funzionano come Expert Advisors durante i test.

Avete bisogno di qualcosa come questo per guardare le correzioni nella storia in base a determinati parametri


Nella storia o nel grafico? Vuoi vedere i risultati in una finestra del grafico, in una finestra separata, stampati in una tabella, e se sì, che tipo di dati, sotto forma di candele di colore diverso, come linee che collegano l'inizio e la fine del movimento?
 
rigonich:

OrderSelect(g_ticket,SELECT_BY_TICKET) prima della linea if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)


Questo è quello che ho fatto:

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);                                                              // открываем лимитный ордер на продажу

    if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

Non ci sono fermate e acquisizioni. Il log dice errore 130, dicendo che gli arresti sono sbagliati. Non ne vedo la ragione.

 
hoz:


Questo è quello che ho fatto:

Non ci sono fermate e acquisizioni. Il log dice errore 130, dicendo che gli arresti sono sbagliati. Non ne vedo la ragione.


Senza if, soloOrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);, e potete lasciarlo in OrdersModifying()

//+------------------------------------------------------------------+

void OrdiniModifica()

{

OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES);

se(g_type == OP_BUY)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits); // Se il parametro di ingresso stop loss non è 0

// Ottieni il valore di Stop Loss per l'ordine selezionato

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits); // Se il parametro di input TakeProfit non è uguale a 0, allora...

// ottenere il valore di TakeProfit per l'ordine selezionato

}

se(g_type == OP_SELL)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits); // Se il parametro di ingresso dello stop loss non è 0

// Ottieni il valore di Stop Loss per l'ordine selezionato

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits); // Se il parametro di input TakeProfit non è uguale a 0, allora...

// ottenere il valore di TakeProfit per l'ordine selezionato

}

if(sl != 0 || tp != 0) // Se i valori ottenuti di sl e tp non sono uguali a 0, allora..

{

OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime); // Modifica ordine

}

}


 
anton.veksler:

Problema con Symbol() MT4:

2 funzioni da illustrare:

L'esecuzione del primo produce una stringa vuota:

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

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


Non potete usare nomi riservati (valore) quando dichiarate le vostre variabili, chiamate _value
 
hoz:


Questo è quello che ho fatto:

Non ci sono fermate e acquisizioni. Il log dice errore 130, dicendo che gli arresti sono sbagliati. Non ne vedo la ragione.

E non lo faranno!

  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) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!
 

Vitaly, ho fatto come hai detto tu, ma non è cambiato nulla. A quanto pare il bug è sepolto da qualche altra parte.

Prima avevo tutto (ordini di apertura - modifica e trasferimento a b.w. quando il livello di prezzo impostato viene raggiunto) e tutto funzionava. Era così:

bool Trade (int signal)
{
  FindOrders();
  
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет...
    if(!OpenBuy())                                                           // открываем лимитный ордер на покупку
      return(false);
        
  if(signal == SIGNAL_SELL)                               // Если сигнал на продажу и открытых ордеров нет..
    if(!OpenSell())                                                          // Открываем лимитный ордер на продажу
      return(false);
  
  int total = OrdersTotal() - 1;
  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);      // Модифицируем ордер
      }
    }
  }

  return(true);
}

Ora, dato che ho suddiviso tutto in funzioni specializzate specifiche, tutto ha smesso di funzionare così tanto. Ho provato in entrambi i modi, ma non funziona niente, non ci sono fermate.

 
borilunad:

E non lo faranno!

 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) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!

Dov'è la logica in questo? Vorrei capire... Ecco la funzione:

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);      // Модифицируем ордер
      }
    }
  }
}

Se le variabili di input i_sl e i_tp non sono uguali a zero, otteniamo i prezzi di stop e take che saranno già nell'ordine - sl etp. Dopo di che controllerò se abbiamo calcolatosl etp qui (se per gli short):

 if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }

Se i valori sono ottenuti, allora non possono essere zero... perché saranno cambiati! Queste sono variabili che otteniamo in modo sequenziale in base al contesto del codice.

E qui, ho controllato se abbiamo trovato i valori di stop e take. Come possono essere zero dopo tutte le condizioni?

if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
 

Prima costruisci la tua logica all'inizio, poi fai funzioni, file, ecc.

Perché grattarsi la mano sinistra dietro l'orecchio destro!