[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 37

 
skyjet:

Grazie mille per la vostra risposta! Ma ancora, come descrivere la barra futura seguendo Ask[0],Bid[0]?

Non appena questa barra futura apparirà, diventerà zero. E la barra che ora è [0] sarà [1].


Ask e Bid NON sono array, c'è solo un valore corrente, tutti quelli passati sono dimenticati

 

Per favore aiutatemi a capire il calcolo del deposito
perché il mio deposito stimato coincide esattamente con il terminale
solo quando tutti gli ordini sono completamente bloccati
. Quando aggiungo un altro ordine al sistema di ordini - il risultato del deposito
terminale differisce sempre dal mio deposito stimato molto leggermente
ma non posso mai arrivare ad essere un proiettile in un proiettile!
Ecco un esempio molto breve:

Il conto ha 4 ordini di 10.00 lotti ciascuno, due di essi moto
e due vendite. È chiaro che il conto è in equilibrio e tutti gli ordini sono bloccati
Calcoliamo il deposito standard per ogni ordine, lo dividiamo per 4 e tutto è in punta di piedi
Il terminale bussa esattamente.

Mettiamo un altro byke a 1.00 lotto a 1.4059
Calcoliamo il deposito. È chiaro che per questo dobbiamo pagare il deposito standard
dato che tutti gli ordini esistenti sono nella scatola.
Per una leva di 1:100 abbiamo l'impegno per la nuova moto

ZALBuy = 140.59*1.00 = 140.59

Perciò, il deposito precedente deve essere aumentato di questo importo,
Aggiungete il deposito precedente e il deposito per il nostro 1.00 byte

ZAL=ZALold + ZALBuy = 1407.23 + 140.59 = 1547.82

Dopo l'impostazione del bye nel terminale il deposito è risultato essere 1547.91
Questo sarebbe accettabile se avessi messo il bye 9 punti più alto di
al tasso di cambio 1.4068 Perché se calcoliamo l'aumento reale del deposito
come la differenza del deposito prima e dopo, otteniamo esattamente il deposito standard
per 1.00 lotto al tasso 1.4068

1547.91 - 1407.23 = 140.6801

Cambiato versione del terminale, ahimè, non ha aiutato!

-----------------------------------------------

Per favore perdonatemi se vi rubo del tempo, ma queste
piccole discrepanze costanti mi danno veramente fastidio
perché la mia macchina conta diverse opzioni,
e il deposito come saldo e il profitto è usato per calcolare
tutti i parametri del conto dopo certe azioni prima che siano implementate
. Quindi la precisione è molto desiderabile qui.
Forse non capisco qualcosa, ma ho cercato nella documentazione
e non ho trovato la ragione di questa discrepanza.
Vi sarei molto grato per il vostro aiuto!


Saluti MADZX
 
keep87:


Potete dimenticarvi di questa impostazione. La citazione si verifica se la mensa vuole prendere i tuoi soldi, non gli importa quale sia il divario, lo faranno comunque). Questa è la realtà dell'algotrading della maggior parte delle compagnie truffaldine che si definiscono "il miglior broker XXXXX" (XXXXXX - inserire il nome di un continente o galassia, qualsiasi cosa)

Cambiare o non cambiare l'impostazione, tutto rimane uguale.


Assolutamente giusto! L'ho visto anch'io!
 
skyjet:
Ciao, puoi darmi una descrizione di un vero bar +1. Per esempio ho bisogno del prezzo della prossima barra, non di quella attuale.

Per quanto ho capito si sta cercando di ottenere informazioni dalla macchina dal futuro
Se trovi un modo - condividi, te ne sarei grato :)
 
Kobalerro:
Saluti a tutti. Io stesso sono nuovo nella programmazione, quindi per favore risolvete il problema.

È necessario che più EAs sullo stesso conto, aprano un numero limitato di ordini.

Per esempio: 10 EAs ma possono aprire solo 5 ordini, ma non più di uno per coppia di valute.

Questo è stato implementato come segue, ma non funziona così.

extern int МаксКолОрдеров   = 5;

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

int ПодсчетОткрОрдеров() {
  int k=OrdersTotal();
   if (Символ=="0") Символ=Symbol();
    for (int i=МаксКолОрдеров; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Символ || Символ=="") {
       if (МагикНомер<0 || OrderMagicNumber()==МагикНомер) {
      if (OrderMagicNumber()<1) return(True);
     }
    }
   }
  }
 return;

}

//+------------------------------------------------------------------+
int start()
  {
   if(ПодсчетОткрОрдеров()==0)ПровТоргУсловий();
   }


Io implementerei un tale spettacolo come segue:
Tutti e 10 i tuoi cavalli stanno lavorando ognuno sul proprio programma, come se fossero in stanze adiacenti
e quindi nessuno di loro sa cosa sta facendo il vicino dietro il muro - questo è il problema principale
per la tua idea!
Pertanto, vorrei istruire ogni EA a scrivere le loro azioni in un file di disco
che sarà disponibile per tutti i cavalli, perché è nella directory del terminale.
Se qualcuno di loro ha un desiderio ardente di fare qualcosa nella loro finestra
dovrebbe prima analizzare questo file e verificare la possibilità di implementare
desiderio!
rispetto al tuo scenario devi aggiungere nel file il numero di ordini
e le coppie di valute su cui sono aperti
. Per esempio:
EURUSD 1
GBPUSD 1
EURGBP 0

Qui vediamo che non possiamo aprire trade suEURUSD eGBPUSD perché lo script non permette a
di avere più di un ordine per coppia.
E' chiaro che ci saranno tante linee quante sono le coppie al lavoro.
Con questa soluzione tutti i tuoi cavalli saranno sempre consapevoli di ciò che sta succedendo al momento
, e saranno in grado di calcolare se qualsiasi azione è consentita o meno al momento.
Quando imposti un ordine su qualsiasi coppia, devi mettere 1 nella linea giusta
Quando lo chiudi, sostituiscilo con zero
Questo funzionerà sicuramente, anche se un po' complicato per un principiante
. Ma vai avanti, perché tutti erano lì - come un principiante fino al momento giusto!

Buona caccia!
MADZX

 

Sto scrivendo una strategia di pullback. Ho bisogno di piazzare un ordine stop sopra (sotto) l'estremo della candela corrispondente. Ecco un esempio:

È chiaro che se la chiusura è sotto l'apertura, è una candela ribassista, e viceversa - una candela rialzista. Voglio sapere come fare una condizione che dica che la candela precedente è rialzista... ... così e così.

Logicamente, faccio una funzione che determina il tipo di candela.

int CandleType()
{
  if(Open[1] > Close[1])
    return(BullCandle);
    
  if{Open[1] < Close[1]}
    return(BearCandle);
    
  return(dodji);
}

Poi si dovrebbe chiedere in qualche modo se la barra con l'indice 1 è rialzista o ribassista... ...e fare qualcosa...

Come si fa?

 
madzx:


Io implementerei un programma del genere in questo modo:
Tutti e 10 i tuoi cavalli stanno lavorando ognuno sul proprio programma, come se fossero in stanze adiacenti
e quindi nessuno di loro sa cosa sta facendo il vicino dietro il muro - questo è il problema principale
per la tua idea!
Pertanto, vorrei istruire ogni EA a scrivere le loro azioni nel file del disco
che sarà disponibile per tutti i cavalli, perché è nella directory del terminale.
Se qualcuno di loro ha un desiderio ardente di fare qualcosa nella loro finestra
dovrebbe prima analizzare questo file e verificare la possibilità di implementare
desiderio!
rispetto al tuo scenario devi aggiungere nel file il numero di ordini
e le coppie di valute su cui sono aperti
. Per esempio:
EURUSD 1
GBPUSD 1
EURGBP 0

Qui vediamo che non possiamo aprire operazioni suEURUSD eGBPUSD perché lo script non permette a
di avere più di un ordine per coppia.
È chiaro che ci saranno tante linee quante sono le coppie in funzione.
Con questa soluzione tutti i tuoi cavalli saranno sempre consapevoli di ciò che sta succedendo al momento
, e saranno in grado di calcolare se qualsiasi azione è consentita o meno al momento.
Quando imposti un ordine su qualsiasi coppia, devi mettere 1 nella linea giusta
Quando lo chiudi, sostituiscilo con zero
Questo funzionerà sicuramente, anche se un po' complicato per un principiante
. Ma vai avanti, perché tutti erano lì - come un principiante fino al momento giusto!

Buona caccia!
MADZX

Grazie per il suggerimento, ma è un po' troppo complicato. E poi nella tua versione risulta che tutto funziona, e ci vogliono 10 per controllare la condizione di entrata,

Aprono solo i primi cinque che ce l'hanno fatta e poi, quando uno di essi si chiude, si riapre il primo che corrisponde alle condizioni,

non limitato a EURUSD 1 , GBPUSD 1 , EURGBP 0.

Penso che ci dovrebbe essere una soluzione più semplice. Dovrebbe essere simile al conteggio del numero totale di ordini con una condizione di limitazione per un dato parametro.

E la limitazione può essere impostata sia da un simbolo che da un numero magico non superiore a uno.

Anche se la tua versione probabilmente funzionerebbe anche, ma non riesco a decidere come implementarla nel codice.

 
hoz:

C'è una cosa strana che sta succedendo qui. Ecco la funzione degli ordini di apertura:

ecco l'errore:

if(SL < g_stopLevel)
    SL = g_stopLevel*pt;

se stop level = 5 allora stai cercando di mettere uno stop loss a 0,00005.

Il secondo errore è che non controlli dove stai piazzando l'ordine. Se la candela ha chiuso al massimo o vicino al minimo, otterrai l'errore 130. Come puoi vedere nell'immagine, il server ha aperto un ordine di vendita invece di un sellstop perché hai cercato di aprire un ordine sellstop a un prezzo superiore o uguale al prezzo corrente.

Imparare ad usare la stampa. Basta mettere Print(); nel posto giusto, mettere le variabili richieste tra parentesi e separarle con questo: ," ", in questo modo: Print(Price," ",SL); e durante le prove al momento di aprire un ordine nella scheda "Esperti" vedrete a cosa sono uguali queste variabili, e sarete in grado di capire cosa è sbagliato.

Il log mostrerà anche cosa sta cercando di fare l'EA, dove impostare uno Stop Loss e un Take Profit. Lì troverete tutto ciò di cui avete bisogno.

Logicamente, faccio una funzione che rileverà il tipo di candela.

Lavoriamo all'interno della funzione start.

Per prima cosa, creiamo una variabile in cui scriveremo la direzione della candela precedente.

int Candle=-1;

Lo riempiremo con alcuni valori, uno dei quali denoterà un rialzista, un altro - ribassista. Se -1, non è niente (non è stato determinato o non ha direzione close=open).

Valore che propongo di usare per analogia con un ordine commerciale 0 - comprare, 1 - vendere;

allora dobbiamo scrivere:

se(Close[1]>Open[1]) Candle=0; altrimenti
se(Close[1]<Open[1] Candle=1;

Ora abbiamo una direzione definita e possiamo usarla direttamente nella funzione OrderSend( string symbol, int cmd, ...altre cose...);

if(Candle!=-1) OrderSend( Symbol(),Candle, ...altra roba...);

o seguendo la tua analogia:

if(Candle==0) OpenBuy();
if(Candle==1) OpenSell();

 
Kobalerro:

Grazie per il suggerimento, ma è un po' troppo complicato. E poi si scopre che tutti funzionano nella tua versione e ci vogliono 10 per controllare la condizione di entrata,

e aprono prima solo i cinque che hanno fatto in tempo e poi quando uno di essi si chiude, si apre di nuovo il primo che corrisponde alle condizioni,

non limitato a EURUSD 1 , GBPUSD 1 , EURGBP 0.

Penso che ci dovrebbe essere una soluzione più semplice. Dovrebbe essere come contare il numero totale di ordini con una condizione di limitazione per un dato parametro.

E dobbiamo limitare questo numero o con un simbolo o con un numero magico, o non più di uno.

Anche se, forse, la tua variante funzionerà anche, ma come implementarla nel codice, non posso pensare.


O forse come questo:

if(NumberOfPositions("EURUSD")==0 && NumberOfPositions()<10)
Ecco una funzione
 
keep87:

c'è un errore qui:

se livello di stop = 5 allora stai cercando di mettere uno stop loss a 0,00005.

Il secondo errore è che non controlli dove stai piazzando l'ordine. Se la candela ha chiuso al massimo o vicino al minimo, otterrai l'errore 130. Come puoi vedere nell'immagine, il server ha aperto un ordine di vendita invece di un sellstop perché hai cercato di aprire un sellstop a un prezzo superiore o uguale al prezzo corrente.

Imparare ad usare la stampa. Basta mettere Print(); nel posto giusto, mettere le variabili richieste tra parentesi e separarle con questo: ," ", in questo modo: Print(Price," ",SL); e durante le prove al momento di aprire un ordine nella scheda "Esperti" vedrete a cosa sono uguali queste variabili, e sarete in grado di capire cosa è sbagliato.

Il log mostrerà anche cosa sta cercando di fare l'EA, dove impostare uno Stop Loss e un Take Profit. Mostrerà tutto ciò che è necessario.

Lo uso così di tanto in tanto. Guardate, ora le funzioni appaiono così:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  int ticket = -1;
  string myNote = "Сов баянул";
  
  double price = High[1] + i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = Low[1] - i_thresholdFromBasedSL*pt ;
  Print("SL = ", SL);

  if(price > Ask)
  {
    ticket = OrderSend(Symbol(),OP_BUYSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Navy);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(High[1] + i_tp*pt,Digits),0,Navy))
    return(false);
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int ticket = -1;
  string myNote = "Сов шортанул";
  
  double price = Low[1] - i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = High[1] + i_thresholdFromBasedSL*pt;
  Print("SL = ", SL);
  
  if(price < Bid)
  {
    ticket = OrderSend(Symbol(),OP_SELLSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Red);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(Low[1] - i_tp*pt,Digits),0,Red))
    return(false);
    
  return(true);
}

Ho letto nel diario:

2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: modify #1 buy stop 0.10 EURUSD at 1.32103 sl: 1.32007 tp: 1.32243 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: open #1 buy stop 0.10 EURUSD at 1.32103 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3201
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.321
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: OrderSend error 130
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3194
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.3204
2012.12.25 18:20:14     5_minites_TS_by_Philippe Nell inputs: i_fastMaPeriod=10; i_slowMaPeriod=21; i_filtrMaPeriod=50; i_trading_TF=5; i_thresholdFromInput=1; i_thresholdFromBasedSL=1; i_slippage=3; i_tp=15; i_myMagic=33330215; 
2012.12.25 18:20:12     5_minites_TS_by_Philippe Nell EURUSD,M5: loaded successfully

Quindi inizialmente dal prezzo di acquisto allo stop era la differenza 1,3204 - 1,3194 = 0,001 punti

Altri 1,3210 - 1,3201 = 0,009 punti

E per qualche ragione nel secondo caso, lo stop era più vicino al prezzo di entrata, ma non c'era nessun errore! Ci ho pensato e non l'ho capito.

Ho corretto l'errore più tardi in un modo diverso. Ci sono già delle condizioni nel codice:

if(price > Ask) && if(price < Bid) rispettivamente per comprare e vendere. O c'era un'altra variante? Ora non abbiamo più errori. Ma, tuttavia, mi piacerebbe ascoltare l'opinione di un programmatore più esperto.