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

 
yosuf:
Qual è il codice?
Non c'è un codice nei vostri EA? In tutti gli EA, tutto è quasi uguale! Differiscono solo nel modo di codificare e nelle preferenze del codificatore. Guarda il tuo e continua a farlo!
 
rigonich:

A proposito, ho riflettuto a lungo su questa domanda, ma non l'ho mai scoperto, l'ho solo dimenticato. Dove prende il tester i valori di stopplay? Se i valori reali possono essere cambiati dal server, allora il risultato del test dovrebbe dipendere dal tempo del test, il che non è il caso, ho controllato. O il valore memorizzato nelle proprietà del simbolo e il valore dato dal server su richiesta non è lo stesso?
Le variabili dell'ambiente di mercato sono nel file di servizio symbols.raw (presumibilmente), che si trova nella cartella della storia del server. Quando non c'è connessione al server o nei fine settimana, il terminale prende gli ultimi dati da questo file.
 
xant:

rigonich

È una specie di scherzo o qualcosa del genere? Dove si ride?

TarasBY

Non puoi? Allora non farlo.

Ascolta, mostro dalle orecchie sporgenti, sei stato aiutato, e non puoi nemmeno portare un codice già pronto nel tuo Expert Advisor! E tu stai solo aprendo la bocca. Si può almeno spiegare a un idiota! DA PARTE DI.
 

TarasBY

Non si muove un cazzo, stronzo. Sei tu il mostro. Perché non sai nemmeno articolare bene due parole in russo.

Sei uno stronzo? Beh, non ho bisogno di torturarti. Riposati un po'.

 
TarasBY:
Le variabili dell'ambiente di mercato sono nel file di servizio symbols.raw (presumibilmente), che si trova nella cartella della storia del server. Quando non c'è connessione al server o nei fine settimana, il terminale prende gli ultimi dati da questo file.


Grazie.
 
xant:

rigonich

È una specie di scherzo o qualcosa del genere? Dove si ride?

TarasBY

Non puoi? Beh, non avresti dovuto.

Ho scritto in russo - non c'è quasi nulla sulla dichiarazione delle variabili globali nel libro di testo. Per esempio, non so cosa sia fGet_MineGV();

È una funzione? Se lo è, cosa fa? La ricerca di fGet nel libro di testo produce zero risultati.

Cosa dovrei dichiarare in int init() ? Lei ha scritto:

{
fGet_MineGV();
}


Qui nel mio EA l'inizializzazione di init appare così:

int init()
{
ArrayInitialize(buf3,0);
ArrayInitialize(b1,0);
ArrayInitialize(b2,0);
ArrayInitialize(b3,0);
ArrayInitialize(b4,0);


Commento("Calcola il valore medio "+ind);
m1=NormalizeDouble(iCustom(NULL,tf,ind+"_a",0,0),2);
stringa d="Valore medio "+ind+"+DoubleToStr(m1,2);
tm=TimeCurrent();
int q=0,ticket=-1;
doppio opr=0,lot1=0;
for(q=0;q<OrdersTotal();q++)
{

e così via, altre 100 linee. Dove, in quale luogo e, soprattutto, cosa dovrei dichiarare esattamente qui? È davvero così difficile scrivere in russo? Pieghiamo le dita, sì.

È una funzione? Se sì, cosa fa? La ricerca da manuale per fGet dà zero risultati.

Sì, questa funzione, e non ci può essere nulla al riguardo nel tutorial, non era disponibile al momento in cui il tutorial è stato scritto. Questa è una funzione definita dall'utente, che è stata scritta appositamente per voi.

      void fGet_MineGV (string fs_PrefName = ""// префикс имени переменной
       {
        string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
        if (GlobalVariableCheck (ls_Name)) SUA = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
        if (GlobalVariableCheck (ls_Name)) SUA1 = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
        if (GlobalVariableCheck (ls_Name)) BUA = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
        if (GlobalVariableCheck (ls_Name)) BUA1 = GlobalVariableGet (ls_Name);
        //----
    }
 
Buonasera, un trailing stop funziona immediatamente dopo che l 'ordine è stato piazzato. E dovrebbe funzionare solo quando l'ordine con il ticket tocket si muoverà nella storia, e si muoverà rigorosamente al TakeProfit.


//***************************************   
 
  nahodka=false;
 
 
 if (OrderSelect(tocket, SELECT_BY_TICKET , MODE_HISTORY))  
 if (OrderTakeProfit( )-3*Point<profitsell&&OrderTakeProfit( )+3*Point>profitsell) nahodka=true;
     // Находим ордер, сработавший именно по тейкпрофиту 
 
 
  
 if(nahodka){if (OrderSelect(tecket,SELECT_BY_TICKET)){
 if(OrderStopLoss( )>Bid+treylingstop*Point ){ Print ("четвёртаямодифи    " );
 OrderModify(  tecket, OrderOpenPrice(), Bid+treylingstop*Point, OrderTakeProfit(), 0, CLR_NONE);}}}
  // Модифицируем оставшийся ордер
 for ( i = OrdersTotal() - 1; i >= 0; i--)
 

rigonich

L'ho fatto all'inizio. Ho inserito questo pezzo di codice nella funzione init, l'ho compilato e ho ottenuto una nota:

Lafunzione "fGet_MineGV" non è referenziata e sarà rimossa dal file exp

Questo avvertimento mi è chiaro perché non c'è ancora nessun record, quindi non può leggere nulla, giusto?

Dopo di che scrivo la seconda parte del codice all'interno della funzione start. Questo frammento si presenta così

void fSave_MineGV (string fs_PrefName = "") // prefisso del nome della variabile
{
static datetime ldt_NewBar;
datetime ldaTBeginBar = iTime (Symbol(), 1, 0)
//---- Salva all'inizio di ogni minuto
if (ldt_NewBar == ldaTeginBar) return;
ldt_NewBar = ldaTBeginBar;
//---- Salvare i valori di ogni variabile a turno
stringa ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
GlobalVariableSet (ls_Name, SUA);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
GlobalVariableSet (ls_Name, SUA1);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3")
GlobalVariableSet (ls_Name, BUA);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
GlobalVariableSet (ls_Name, BUA1);
}

È tutto a posto qui?

Inserisco questa parte di codice subito dopo il calcolo di SUA, SUA1, BUA, BUA1.

Ma alla compilazione, l'Expert Advisor dà il seguente output:

27 errore(i), 64 avviso(i)

 

xant:

rigonich

L'ho fatto all'inizio. Ho inserito questo pezzo di codice nella funzione init, l'ho compilato e ho ottenuto una nota:

La funzione "fGet_MineGV" non è referenziata e sarà rimossa dal file exp

Questo avvertimento mi è chiaro perché non c'è ancora nessun record, quindi non può leggere nulla, giusto?

Dopo di che scrivo la seconda parte del codice all'interno della funzione start. Questo frammento si presenta così

void fSave_MineGV (string fs_PrefName = "") // prefisso del nome della variabile
{
static datetime ldt_NewBar;
datetime ldaTBeginBar = iTime (Symbol(), 1, 0)
//---- Salva all'inizio di ogni minuto
if (ldt_NewBar == ldaTeginBar) return;
ldt_NewBar = ldaTBeginBar;
//---- Salvare i valori di ogni variabile a turno
stringa ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
GlobalVariableSet (ls_Name, SUA);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
GlobalVariableSet (ls_Name, SUA1);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3")
GlobalVariableSet (ls_Name, BUA);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
GlobalVariableSet (ls_Name, BUA1);
}

È tutto corretto qui?


Le descrizioni delle funzioni non possono essere messe né in start, né inite, né in nessun'altra funzione. Devono essere messe separatamente. Puoi metterla nel mezzo, o all'inizio, o alla fine del tuo EA, ma non in altre funzioni. Dovresti mettere la chiamata alla funzione solo nell'init, puoi metterla all'inizio.

Questa osservazione è chiara per me, perché il record non è stato ancora creato, non può contare nulla, giusto? Esattamente, non c'è una descrizione della funzione, che il compilatore cerca dove dovrebbe essere - al di fuori delle funzioni pragmatiche.

{

fGet_MineGV();
}

Lo stesso vale per la seconda funzione. Questo è un primer, ed è difficile supporre che qualcuno che fa programmazione, anche un principiante, non possa saperlo.

 
Dimka-novitsek:
Buonasera, il trailing stop funziona immediatamente dopo che l'ordine è stato piazzato. E dovrebbe funzionare solo quando l'ordine con il biglietto si muoverà nella storia, e si muoverà rigorosamente da TakeProfit.

Ma, se la tua cronologia non è vuota, quasi certamente ci troverai un ordine innescato esattamente al Take Profit? A quanto pare, non stai cercando nella cronologia un ordine chiuso a TP, ma stai controllando attraverso la cronologia come si è chiuso l'ordine di cui hai bisogno, e se si è chiuso del tutto. Questo è quello che dovete controllare, perché controllate esattamente qual è il prezzo di chiusura del vostro ordine? Tre opzioni - 1. prezzo di chiusura==0 - se l'ordine è a mercato, non è nella storia (OrderSelect() restituirà false) 2. prezzo di chiusura è uguale a
OrdineTakeProfit()
-- l'ordine ha chiuso al prezzo di stop, 3.
OrdineTakeProfit()
-- l'ordine non si è chiuso allo stop .
Motivazione: