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

 
Fox_RM:
Buon pomeriggio!
Ho riscontrato un problema con l'apertura di un certo numero di ordini (definito dall'utente).
Ho scritto un piccolo codice per risolvere questo problema.
Ma ci sono momenti in cui viene aperto un numero arbitrario di ordini, di solito verso la fine del test.

Qui sotto c'è il codice stesso.

Se avete una soluzione più semplice, sarei felice di ricevere commenti.


Questo è probabilmente meglio.

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;
//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

  if(OrdS<=OrederSell)
    { //----- start 
    if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
       {
      ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if(OrdB<=OrederBuy)
     { //-----start
     if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
        {
        ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians:
Grazie, ma è un po' complicato per me, e la tua funzione emette 4 messaggi in una volta sola, mentre io ho bisogno di uno solo. Risulta che non ci sono più di 64 caratteri in una riga?

No. Prendete il vostro lungo messaggio e dividetelo in tante parti quante se ne possono leggere sullo schermo, ma non più di quattro. La cosa principale è che ogni parte non deve superare i 64 caratteri. Se il vostro messaggio è breve, potete passarlo a una funzione in una sola parte.

Guarda, ho allegato un tipster nel trailer per testare questa funzione. Eseguilo nel tester in modalità visiva e metti l'indicatore Win_Inform sul grafico di visualizzazione (è nel mio messaggio precedente nel trailer). Vedrete immediatamente come funziona questa funzione.

File:
 
r772ra:


Probabilmente è meglio.

Questo è il codice che ho usato per iniziare ad aggiornare il mio. Ci sono 3 problemi nella tua versione:

- non appena vengono aperti gli ordini OP_BUY e OP_SELL, i parametri OrdB e OrdS aumentano automaticamente ad ogni tick, quindi ho aggiunto la condizione di ricalcolo solo al cambio del tick corrispondente (vendere o comprare);

- il ricalcolo di tutti gli ordini porta all'errore OrdB e Ord, abbiamo bisogno di considerare solo l'ultimo cambiamento negli ordini;

- nella tua versione non c'è la diminuzione dei parametri OrdB e Ord per l'ulteriore apertura degli ordini if (OrdB<=OrederBuy),if(OrdS<=OrederSell).

Questo sembra essere il caso.

 
Fox_RM:

Questo è il codice che ho usato per iniziare ad aggiornare il mio. Ci sono 3 problemi nella tua versione:

- non appena vengono aperti gli ordini OP_BUY e OP_SELL, i parametri OrdB e OrdS aumentano automaticamente ad ogni tick, quindi ho aggiunto la condizione di ricalcolo solo al cambio del tick corrispondente (vendere o comprare);

- il ricalcolo di tutti gli ordini porta all'errore OrdB e Ord, abbiamo bisogno di considerare solo l'ultima modifica degli ordini;

- nella tua versione non c'è la diminuzione dei parametri OrdB e Ord per l'ulteriore apertura degli ordini if (OrdB<=OrederBuy),if(OrdS<=OrederSell).

Sembra essere lo stesso.

Giusto, dobbiamo azzerare i contatori degli ordini prima del ciclo for

//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS=0;
     OrdB=0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   


 

Buon pomeriggio, per favore aiutatemi a capire la funzione di Kim:

 
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
 if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

Non capisco la linea

if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

Perché non ci sono segni dopo il primo se, cosa succede quando un'espressione è scritta così. Cosa fa StringFind e perché la stringa viene cercata da JPY? Come può d = 0, e in quale caso si assegna 2 e in quale 4? Sarò molto grato per la risposta, grazie in anticipo)))

 
r772ra:

Esatto, prima del ciclo for, dobbiamo azzerare i contatori degli ordini

)) Per qualche motivo non ci ho pensato io stesso e ho iniziato ad annaspare.
 
Fox_RM:
)) Per qualche motivo non ci ho pensato io, ho iniziato a prendere fiato.

Che liberazione!
 
Lisi4ka330: perché non ci sono segni dopo il primo if, cosa succede se l'espressione è scritta così... Come può d = 0, e in quale caso si assegna 2 e in quale 4? Sarei molto grato per una risposta, grazie in anticipo)))

Penso che questo abbia più senso

if (d==0)
{ 
  if (StringFind(sy, "JPY")<0)
  {
    d=4;
  } 
  else
  {
    d=2;
  }
}

d - precisione della citazione (cifre dopo la virgola)

se c'è una coppia JPY, allora il tasso per le major è xxx.xx

se non c'è JPY nella coppia, allora il tasso per le major sarà x.xxxx (da cui il nome"quattro cifre")

 
r772ra:

Sì, giusto, prima del ciclo for, dobbiamo azzerare i contatori degli ordini


Mi è sfuggito un altro punto:

- nella vostra versione, non c'è diminuzione dei parametri OrdB e OrdS per l'ulteriore apertura degli ordiniif (OrdB<=OrederBuy),if (OrdS<=OrederSell).

Nella nuova versione, abbiamo, per esempio, aperto 5 ordini, li abbiamo ricalcolati, ma la condizione if non ci permette di aprire altri ordini. Nella mia vecchia variante, OrdB-- e OrdS--

sono stati utilizzati.

 
GaryKa:

Penso che questo abbia più senso

d - precisione della citazione (cifre dopo la virgola)

se c'è una coppia JPY, allora il tasso per le major è xxx.xx

se non c'è JPY nella coppia, allora i tassi per le major sono circa x.xxxx (da cui il nome "quattro cifre")

GaryKa, grazie per la risposta, è un po' poco chiaro come d possa essere 0, perché la funzione
 d=MarketInfo(sy, MODE_DIGITS)
restituisce il numero di cifre decimali, quindi d sarà sempre maggiore di 0 e la condizione sarà sempre falsa