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

 
MarkTrade:


Funziona... Grazie!

Vorrei solo capire perché la mia versione non vuole funzionare...

Non vedi la differenza? Avete un paragone sbagliato.

if (a && b < c) - non puoi farlo.

if (a<c && b<c) - questo funziona

 
artmedia70:

Non vedi la differenza? Hai sbagliato il paragone.

if (a && b < c) - non puoi farlo.

if (a<c && b<c) - è possibile.



No, ho notato la differenza. È solo che credevo che fosse possibile se (a && b < c)... :-)

Ora lo so, grazie!

 
MarkTrade:


No, ho notato la differenza. È solo che credevo che fosse possibile se (a && b < c)... :-)

Ora lo saprò, grazie!

Forse volevi dire if(a+b < c) ? Allora si può fare così!
 
skyjet:


Grazie ancora! Ora ho provato a rendere ottimizzabile il numero di barre "controllabili", ma i risultati nella finestra proprio non ci sono. Ho cercato di iniziare a contare sia dall'inizio che dalla fine, ma invano.

extern int number=3;
//------------------------------------+
for (int x=number; x>1; x--) // x>1 (а не x>=1)
{
if(Open[x]==Open[x-1]) continue;
if(Open[x]<Open[x-1])
   {
    //--- action 1
   }
else
   {
    //--- action 2
   }
}

Cosa intendi per "...nessun risultato nella finestra"? Forse stai visualizzando i risultati nella finestra in modo errato e c'è un errore altrove nel programma?

 

Cari compagni! Si prega di consigliare se esiste una letteratura (libri di testo) sulla programmazione di linee basate sull'analisi tecnica, compresi i livelli Fibo. È auspicabile con esempi di codice di programma "for dummies".

O chi può suggerire un consigliere simile con codice open source.

Vi sono grato in anticipo.

 
alexey1979621:

Cari compagni! Si prega di consigliare se esiste una letteratura (libri di testo) sulla programmazione di linee basate sull'analisi tecnica, compresi i livelli Fibo. Preferibilmente con esempi di codice "for dummies".

Non so come usarlo.

Sono molto grato.

Cosa c'è di sbagliato in questo libro di testo? Qualsiasi cosa ti serva, studia, fai pratica, buona fortuna!
 
artmedia70:
Capite e vedete cosa è contenuto nel vostro array immediatamente dopo che è stato "riempito" con i dati dell'ordine? No. Non lo sai, lo supponi soltanto. SPRINTATE il contenuto di tutte le celle dell'array, non con la vostra pr(), ma con la normale Print() e provate a guardare nel log del tester e vedere cosa avete nell'array, in ogni cella, subito dopo che è stato riempito. Quando sapete per certo che il contenuto dell'array corrisponde alle vostre idee sul suo contenuto, allora stampatelo con la vostra pr(). Se non vi dà gli stessi risultati - è il vostro pr(), se i dati corrispondono, allora cercate un errore nel passo successivo.

Gli array sono stati stampati, ma, al momento, non si tratta di loro. Descriverò quello che penso di seguito.

A proposito. Ha cambiato tutte le uscite in una stampa standard. La situazione è la stessa. Appare il momento in cui 4 posizioni sono chiuse in +. E poi logicamente dovrebbe funzionare la funzione isCloseByTakeLastOpenPos(), che chiamo dall'inizio in questo modo:

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))        // Наша функция, определяющая.. закрылся ли последний закрытый ордер в + или нет.
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1 && g_type < 6)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

che ci dirà che l'ultimo ordine chiuso è chiuso in take o in profitto. Ecco la funzione:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   Print ("isCloseByTakeLastOpenPos: вошли в функцию");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
      Print ("isCloseByTakeLastOpenPos: первоначальные условия выполнены!");

      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         Print ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   Print ("isCloseByTakeLastOpenPos: последняя закрытая позиция профитна!");
   
   return (true);
}

La situazione è interessante. Tutto funziona. E qui appare la situazione:

Possiamo vedere che 4 posizioni hanno chiuso a take profit. Sono stati chiusi da Takei. Cioè le funzioni che chiudevano gli ordini non funzionavano affatto. La ragione sembra essere che la condizione di chiusura non ha funzionato. Questo è:

 if (isCloseByTakeLastOpenPos(2))

Quando guardiamo questa funzione e stampiamo tutto, diventa chiaro che non è diventato vero in quel momento. Come mai? Dopo tutto, i 4 ordini più esterni hanno chiuso in +. Ho dato il codice della funzione sopra. Ecco cosa c'è nel registro nello stesso momento:

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #104 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #102 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #100 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #98 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:03 2013.08.15 12:30 Tester: order #104, sell 0.93 EURUSD.GI is opened at 1.32831

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: j = 74 2013.08.15 12:30

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: вошли в функцию

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!


Possiamo vedere che la condizione non ha funzionato. Cosa c'è di sbagliato qui?

 
Puoi dirmi se esiste un indicatore che rileva lo spread su tutto il grafico o se è possibile farlo? Ho trovato solo un indicatore che registra lo spread quando il terminale è acceso dal momento in cui è collegato.
 
paladin80:

Cosa vuol dire "...la finestra dei risultati è semplicemente vuota". Forse state visualizzando i risultati nella finestra in modo errato e c'è un errore altrove nel programma?


Ma sto confrontando 3,2 e 1 barre, cioè il calcolo è ostacolato da x >=1?

E significa che le barre con lo stesso prezzo semplicemente non vengono considerate, non gli vengono assegnati numeri?

Impostando i parametri di ottimizzazione: start 1, step 1, end 4; su H1 e H4 la scheda dei risultati è semplicemente vuota, su D1 la stessa redditività con diverso numero di barre analizzate.

if(Open[x]==Open[x-1]) continue;
 

I professionisti non possono andare da nessuna parte senza di te.

Aiuto per la funzione. Che conta l'ultimo numero di ordini perdenti nella storia ad un ordine più.

Cioè, la storia mostra 3 ultimi ordini in meno, poi 1 in più e 2 in meno.

Questa funzione dovrebbe contare gli ultimi tre (prima dell'ordine positivo)