Controllare - cosa ho fatto di sbagliato?

 

Scrivere il codice

int GetN()
{
   int n = 0;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
      {
         bool profit = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
         
         bool loss = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
         
         bool neutral = OrderClosePrice() == OrderOpenPrice();

            SumPosOrder = OrderLots();
            Tiket2 = OrderTicket();
           }


         if(loss)
           {
            n++;
            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
           }

         if(n >= MartinSteps)
           {
            n = 0;
            break;
           }

         if(profit)
           {
            ObchPlus = ObchPlus + (SumPosOrder * 0.8); // Расчет для Бинарных опционов поэтому умножаю на 0,8
           }

         if(profit && ObchPlus < ObchMin)
           {
            n++;
            Pobeda++;
            Sdelok++;
           }



         if(profit && ObchPlus > ObchMin)
           {
            ObchPlus = 0;
            ObchMin = 0;
            Pobeda++;
            Sdelok++;
            n = 0;
            break;
           }
        }
     
   return n;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+

Il compito era originariamente:
Trovare l'ultimo ordine chiuso.
Controllare se si è chiuso nella posizione più o meno.
Conta il numero di scambi
Conta il numero di scambi più e meno.

Calcola l'importo della scommessa.


Se la negoziazione è redditizia (e il totale meno = 0) allora la scommessa numero 1
Se la negoziazione è meno, allora conta il meno e la scommessa numero 2
Se più, ma meno > 0 allora la prossima scommessa.
Ma per qualche motivo non conta correttamente il numero di scommesse e l'importo della scommessa...

 

ad esempio la stringa

bool neutral = OrderClosePrice() == OrderOpenPrice();

probabilmente dovremmo modellare il funzionamento delle condizioni algoritmiche in questo modo:

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

e le altre due condizioni nella stessa vena

 

A proposito, l'ultimo affare nella storia non è sempre l'ultimo affare nel tempo.

 
Nikita Chernyshov #:

A proposito, l'ultimo affare nella storia non è sempre l'ultimo affare nel tempo.

Sì, ho rimosso il campionamento temporale, ma ancora non funziona...
Renat Akhtyamov #:

es. linea

forse dovremmo formare il lavoro di condizioni algoritmiche come questo:

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

e le altre due condizioni nella stessa vena

Ho appena usato questo blocco prima in altri sistemi e ha funzionato perfettamente in questa parte.
ma comunque, sicuramente controllerò e riscriverò. Vi farò sapere il risultato.
 
Natalya Smirnova #:
Sì, ho rimosso il campionamento temporale, ma ancora non funziona... Ho appena usato questo blocco prima in altri sistemi e ha funzionato perfettamente in questa parte.
ma comunque, sicuramente controllerò e riscriverò. Vi farò sapere il risultato.

queste variabili sono resettate da qualche parte?

            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
 
Renat Akhtyamov #:

queste variabili sono resettate da qualche parte?

Sì, all'avvio hanno un valore di 0
e prima del completamento.
 
Renat Akhtyamov #:

queste variabili sono azzerate da qualche parte?

Forse passare da quello mappato.
Rimuoverò la raccolta delle statistiche da questa funzione per ora, e il meno generale e le statistiche in un'altra (la funzione separata produrrà)

Scrivere per blocchi.

Raccogliere statistiche e calcolare meno e più (meno e più sono variabili globali)

if(OrderSelect((OrdersHistoryTotal() - 1), SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
              {
               if(OrderTicket() != Tiket2)
                 {
                  bool profit1 = false;
                  if(OrderClosePrice() > 0)
                    {
                     profit1 = true;
                    }
                  bool loss1 = false;
                  if(OrderClosePrice() < 0)
                    {
                     loss1 = true;
                    }


                  SumPosOrder = OrderLots();
                  Tiket2 = OrderTicket();
                  Print(OrderCloseTime());
                 


               if(loss1)
                 {
                  ObchMin = ObchMin + SumPosOrder;
                  Minus++;
                  Sdelok++;
                 }



               if(profit1)
                 {
                  ObchPlus = ObchPlus + (SumPosOrder * 0.8);
                 }

               if(profit1 && ObchPlus < ObchMin)
                 {

                  Pobeda++;
                  Sdelok++;
                 }




               if(profit1 && ObchPlus > ObchMin)
                 {
                  ObchPlus = 0;
                  ObchMin = 0;
                  Pobeda++;
                  Sdelok++;

                 }
}


Blocco 2 - selezione della variabile n per il calcolo (o meglio la selezione) del tasso

int GetN()
  {
   int n = 0;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
        {
         bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;


        }


      if(loss)
        {
         n++;
        }

      if(n >= MartinSteps)
        {
         n = 0;
         break;
        }

      

      if(profit && ObchPlus < ObchMin)
        {
         n++;
        }



      if(profit && ObchPlus > ObchMin)
        {
         n = 0;
         break;
        }
     }

   Print(n);

   return n;
  }


double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+


Questo sarebbe probabilmente corretto...

 

Continuo a non capire la logica.

Come mai?

bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;

Come può il prezzo di chiusura dell'ordine essere inferiore a zero?

L'ordine BUY è in profitto se il prezzo di chiusura è superiore al prezzo aperto

ecco la condizione di un buy plus (escluse le commissioni e lo swap):

OrderClosePrice() > OrderOpenPrice()
Se è il contrario, è un meno
 
Renat Akhtyamov il prezzo di chiusura dell'ordine essere inferiore a zero?

L'ordine BUY è in profitto se il prezzo di chiusura è superiore al prezzo aperto

ecco la condizione di un buy plus (escluse le commissioni e lo swap):

Se è il contrario, è un meno

Dato che sto scrivendo per le opzioni binarie ho fatto le cose un po' diversamente:

if(OrderProfit() > 0)


Questo sarebbe probabilmente corretto?

 
Natalya Smirnova #:

Forse passare da quello mappato.
Rimuoverò la raccolta delle statistiche da questa funzione per ora, e il totale meno e le statistiche in un'altra (funzione separata che produrrò)

Scrivere per blocchi

Cumulativo meno e più (meno e più sono variabili globali)


Blocco 2 - selezione della variabile n per il calcolo (o meglio la selezione) del tasso


Questo sarebbe probabilmente corretto...

Non voglio interferire e non ho nemmeno guardato il tuo codice e i tuoi consigli...

double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }

ha attirato la mia attenzione. A questo proposito, una domanda: non è più facile e più leggibile usare l'operatore switch

double SelectVolume(int n)
  {
   double Volume = 0.0;
    switch(n)
    {
     case 1  :  Volume = Volume2;     break;
     case 2  :  Volume = Volume3;     break;
     case 3  :  Volume = Volume4;     break;
     case 4  :  Volume = Volume5;     break;
     case 5  :  Volume = Volume6;     break;
     case 6  :  Volume = Volume7;     break;
     case 7  :  Volume = Volume8;     break;
     case 8  :  Volume = Volume9;     break;
     case 9  :  Volume = Volume10;    break;
     default :  Volume = Volume1;     break;
    }
   return(Volume);
  }
Penso che sia più facile da leggere e capire. Forse funziona anche un po' più velocemente.
 
Alexey Viktorov #:

Ti è già stato dato un consiglio su tutto l'algoritmo, non voglio interferire e non ho nemmeno guardato il tuo codice e lo stesso consiglio... Ma questo

ha attirato la mia attenzione. A questo proposito, una domanda: non è più facile e più leggibile usare l'operatore switch

Penso che sia più facile da leggere e capire. Forse funziona anche un po' più velocemente.
Dato che non sono molto esperto, il tuo suggerimento è completamente nuovo per me.
All'inizio l'ho fatto come l'ho trovato, ha funzionato, quindi non ho pensato a migliorarlo.
Sai come si dice: funziona, non toccarlo.

Ma ora cercherò sicuramente di applicare questo metodo. Perché è necessario per imparare e svilupparsi.

Ma ora mi occuperò solo della mia variabile n. Non vuole essere contato.
sempre n = 0 (finora)