[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 334

 
hoz:


Boris, se si commenta una delle condizioni in int GetGeneralSignal(), l'apertura è chiara.

L'ho rintracciato. Il flag non cambia il suo valore quando la redditività degli ordini attualmente aperti è in meno. Ecco la funzione riscritta che dovrebbe impostare i flag short e long su false, cioè proibire l'apertura di una posizione se ci sono ordini negativi:

La funzione chiamante è questa:

Forse le condizioni per il bey sono più adatte? È vero, ho solo vendite aperte oggi a causa di un calo dell'euro molto debole, ma comunque, qualcosa è meglio di niente!
 
borilunad:
Forse le condizioni sono più adatte al bai? Francamente parlando, solo le vendite sono aperte oggi a causa del declino molto debole dell'euro, ma comunque qualcosa è meglio di niente!


No. Il segnale è scritto in int GetGeneralSignal() e funziona chiaramente. Il segnale è primitivo, l'ho preso solo per il test. Se il PCI ha attraversato il confine superiore - compra, e se quello inferiore - vendi. Io stesso non uso gli indici, e ho deciso di controllare questo solo per un esperimento.

Quindi ci siamo. Senza bandiere, tutto funziona perfettamente. Ma non è così per le bandiere. Quando la funzioneint FindOrders(bool&long,bool&short) contiene un ordine del tipo dato e il suo profitto è inferiore a zero, la mia funzione, secondo il riferimento alla funzione GetGeneralSignal(), deve passare un valore falso a un certo flag ma in realtà i flag mostrano sempre true:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         long = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}  

Lo vedo nella stampante, ma non è chiaro perché la bandiera non cambia.

A proposito, ho mostrato la redditività degli ordini nella stampa:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     pr("profitL =" + profitL);
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     pr("profitS =" + profitS);
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

E nella stampa del valore delle bandiere, questo è ciò che viene mostrato:

Cioè è chiaro che quando la redditività è sotto zero, il flag corrispondente dovrebbe essere impostato su false, ma questo non succede... Sembra elementare, ma c'è qualcosa che non va.

 
hoz:


No. C'è un segnale nella funzione int GetGeneralSignal() che funziona bene. Il segnale è primitivo, l'ho preso solo per il test. Se il PCI ha attraversato il confine superiore - compra, e se quello inferiore - vendi. Io stesso non uso gli indici, e ho deciso di controllare questo solo per un esperimento.

Quindi ci siamo. Senza bandiere, tutto funziona perfettamente. Ma non è così per le bandiere. Quando la funzioneint FindOrders(bool&long,bool&short) contiene un ordine del tipo dato e il suo profitto è inferiore a zero, la mia funzione, secondo il riferimento alla funzione GetGeneralSignal(), deve passare il valore falso a un certo flag ma i flag contengono sempre true:

Lo vedo nella stampa, ma non capisco perché la bandiera non cambia.
Guarda, hai scritto long=false in entrambi i casi, quindi come si aprirà?
 
hoz:



Lo vedo nella stampa, ma non è chiaro perché la bandiera non cambi.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false; /// ?????????????????????? 
                 }
                 t++;
              }
   }
   
   return (t);
}  
 

Corretto il refuso.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         short = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}

Ecco uno screenshot:

Potete vedere, sul grafico, che il bai è meno e la bandiera = TRU comunque.

 
Buona sera, potreste dirmi come far apparire il modulo Alert solo una volta quando la condizione si verifica e non ogni volta che la condizione è soddisfatta?
 

Mi dispiace per te! Vi scriverò come funzionerà senza loop, che sono rallentati dalle funzioni! Ecco il tuo codice, ma in cosa lo cambio!

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
bool& long, bool& short)
double profitL,               // Профит лонговой позиции
       profitS;               // Профит шортовой позиции
 
// int start()
 
//.........................................


  
   if(ExistPositions() == false)
   {
      if(long == true)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(short == true)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
   if(ExistPositions() == true)
   {
      if(profitL > 0 && long == true && short == false)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(profitS > 0 && short == true && long == false)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
      


                     
Questo schema è privo di crampi e funziona istantaneamente! Eliminate le funzioni inutili! Potete trovare la funzione ExistPositions() in Funzioni utili di Dear Kim!
 
borilunad:

Mi dispiace per te! Vi scriverò come funzionerà senza loop, che sono rallentati dalle funzioni! Ecco il tuo codice, ma in cosa lo cambio!

Questo schema è facile e funziona immediatamente! Eliminate le funzioni inutili! Potete trovare la funzione ExistPositions() in Funzioni utili di Kim!


Boris, la funzioneExistPositions halo stesso ciclo, solo che ha più controlli inutili, quindi non sarà lenta lungo il percorso. La tua logica mi è chiara, ma il motivo dell'inoperatività della versione precedente non è stato rivelato, il che è strano :)

Si usano anche queste bandiere:

 if(profitL > 0 && long == true && short == false)

E stavo dimostrando che non ritornano correttamente.

Quindi, di nuovo, se le variabili profitL e profitS saranno presenti in questa funzione, i flag non sono necessari.

Ecco come è andata a finire:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(double& profitL, double& profitS)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)              // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);      // Выводим профим через коммент на график
                     }
                 }
                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);     // Выводим профим через коммент на график
                         profitS = OrderProfit();
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
        
   if (FindOrders(profitL, profitS) > 30)
       return (SIGNAL_NO);

   if(ExistPositions() == false)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
      {
         if (GetRSI(0) > i_RSIToUpLimit)
         {
             return (SIGNAL_BUY);
         }
      }
       if (GetRSI(1) > i_RSIToDnLimit)
       {
         if (GetRSI(0) < i_RSIToDnLimit)
         {
             return (SIGNAL_SELL);
         }
      }
   }
   if(ExistPositions() == true)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
         if (GetRSI(0) > i_RSIToUpLimit)
         {
            if(profitL > 0)
               return (SIGNAL_BUY);
         }
      if (GetRSI(1) > i_RSIToDnLimit)
      {
         if (GetRSI(0) < i_RSIToDnLimit)
            if(profitS > 0)
               return (SIGNAL_SELL);
      }
   }
            
   return (SIGNAL_NO);
}

Di nuovo, non si apre su segnale, si apre su qualsiasi cosa.

 
Ciao a tutti!
Sto facendo una traccia virtuale e ho incontrato un problema con closelevel=profitpips-TrailingStop cioè, la traccia e GlobalVariableSet("tral",0) sono attivati come dovrebbero essere, ma la variabile
Alla variabilecloselevel viene assegnato il valore di profitpips(è il profitto attuale in pip) invece di profitpips-TrailingStop con tutte le conseguenze che ne derivano o_o



void Trailing()
   {
    if(!GlobalVariableCheck("tral")&&profitpips>=TrailingStart)
     {
      closelevel=profitpips-TrailingStop;
      GlobalVariableSet("tral",0);
      }
    if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;
    if(GlobalVariableCheck("tral")&&profitpips<=closelevel)
     {
      Print ("ВСЁ ОТЛИЧНО ЗАКРЫЛИСЬ ПО ТРАЛЛУ");
      for (int i=0; i<NumberOfTry; i++) 
        {
         CloseAll();
         Lot=LOT;
        }
      }  
     return;}

L'ho capito, la linea
if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


l'ha cambiato in...
if(GlobalVariableCheck("tral")&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



Ora illivello di chiusuranon è modificatoquando il profitto aumenta...

L'ho già capito.



 
hoz:


Boris, la funzioneExistPositions ha lo stessociclo, ma ci sono più controlli non necessari, quindi non sarà lenta lungo il percorso. La tua logica mi è chiara, ma il motivo dell'inoperatività della versione precedente non è stato rivelato, il che è strano :)

Stai usando anche queste bandiere:

E ho dimostrato che non vengono restituiti correttamente.

Quindi, di nuovo, se le variabili profitL e profitS saranno presenti in questa funzione, allora i flag non sono necessari.

Ecco come è andata a finire:

Anche in questo caso non si apre per segnale, ma per qualsiasi cosa.

Allora fai qualche ricerca a casa tua! Avete una funzione per ogni parola del vostro codice, e dovete accontentarvi delle variabili. Questo è ciò che rende il codice pesante. Dovresti usare le funzioni quando non puoi farne a meno! Ho commentato tutto nel codice di Kim che non mi serve, e funziona tutto molto velocemente! Ricordate, ho chiesto a tutti come rendere il programma più veloce in molte condizioni. Ora il test funziona per un anno su tutte le zecche in 5 minuti! Ho passato al setaccio tutte le condizioni e le funzioni e ho buttato via tutto ciò che non era necessario.