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

 

Ciao a tutti. Ho bisogno di aiuto.

Nel mio EA apre serie di ordini in numero dato dal parametro MaxOrders, sotto ho dato un esempio di come appare, non giudicate dai lotti

1-ordine-lotto=128

2-lotto-ordine-lotto=256

3-lotti-ordine=512

4-ordine-lotto=1024

5-ordine-lotto=2048

questo è ciò di cui avete bisogno per il vostro tester.

MaxOrders=5, e 5 ordini sono aperti. Il problema è che nel tester del broker, il lotto limitato a 1000 è 4 e 5 ordini non si aprono come richiesto.

Ho cercato su Internet un modo per cambiare questo parametro nello Strategy Tester, ma non ho trovato come farlo.

Così, ho deciso di risolvere questo problema usando la programmazione. Ho deciso di aprire diversi ordini per 4 ordini e ottenere due

4-ordine-lotto=1000

4-ordine-lotto=24

per 5 ordini 3:

5-ordine-lotto=1000

5-ordine-lotto=1000

5-ordine-lotto=48

ma ci sono due problemi,

- come dividere correttamente la MM in modo che si divida in lotti secondo il lotto massimo

- Come aprire ordini aggiuntivi senza disturbare l'ordine, cioè ci saranno più ordini che in maxOrders ma non considerare quelli aggiuntivi che vengono aperti per mantenere il volume.

 
solnce600:

Alexei! Buon pomeriggio!

La nostra comunicazione non esce dalla mia testa...... ed ecco perché.....

Ho sentito più di una volta commenti sull'assenza di logica nella mia codifica.

Ieri mi ha spiegato che significa algebra booleana. Questo argomento è molto ampio e molto profondo.

Il fatto è che non sono un matematico e certamente non sono un algebrico.

Capisco alcune cose matematiche non molto complicate.... , ma non subito e cose complesse che il mio cervello non percepisce affatto.

Più di sei mesi fa, prima di iniziare a studiare il manuale di programmazione MCL, mi chiedevo

se potessi capirlo senza capacità matematiche.

Ma il signor Kozlov, nella prefazione al suo libro di testo, ha detto che in realtà è molto più semplice di quanto sembri a prima vista.

a prima vista.

E infatti il 60-70% del suo tutorial penso di essere ora in grado di capire (probabilmente non la prima volta) e di conseguenza posso già codificare qualcosa.

Fino a ieri mi sembrava che tutti i complessi calcoli matematici (che non riesco a capire) li facesse il programma, e io devo solo conoscere le regole con cui

il programma funziona e fa i calcoli.

Ma la nostra conversazione di ieri mi ha portato all'idea che se non imparo l'algebra booleana, i miei codici saranno privi di logica.

Se i miei codici mancheranno di logica booleana, i miei programmi non funzioneranno correttamente, o non funzioneranno affatto.

Ma ieri ho dato un'occhiata a Wikipedia e ho capito che l'algebra booleana e probabilmente la logica non sono per la mia mente!

Ieri a un'occhiata su un frammento del mio codice avete subito concluso che manca la logica booleana.

Se non ti dispiace, potresti spiegare un percorso del tuo ragionamento, che ha preceduto la tua conclusione sull'assenza di logica in questo frammento.

Se lo capisco, andrò avanti. Se non lo capisco ..... probabilmente concluderò che la programmazione è qualcosa che supera di molto le mie capacità.

Grazie.

se (ot==0)
se (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))
if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Andrei, non è tutto così tragico! Usate solo quello che capite! Tutto il resto verrà col tempo!

Per esempio, dopo aver controllato la chiusura per stop usando la funzione di Kim, dovete introdurre una variabile addizionale Lots e prima di aprire una nuova posizione con un lotto raddoppiato dovete scrivere la seguente linea: Lots = Lot*2.0 e questo è tutto! E tu metti un lotto normale, dove non c'è bisogno di raddoppiare!

Perché avete bisogno di codici complessi per cose semplici? Per il bene della scienza, in modo che nessuno possa capirli? Una sorta di protezione contro il "plagio"!

 
borilunad:

Andrei, non è tutto così tragico! Usate solo quello che capite! Tutto il resto verrà a tempo debito!

Per esempio, avendo controllato la chiusura per stop, dovete introdurre una variabile addizionale Lots, e prima di aprire una nuova posizione con lotto raddoppiato, dovete scrivere la seguente linea: Lots = Lot*2.0 e questo è tutto! E tu metti un lotto normale, dove non c'è bisogno di raddoppiare!

Perché avete bisogno di codici complessi per cose semplici? Per il bene della scienza, perché nessuno possa capirli? Una sorta di protezione contro il "plagio"!

Boris! Grazie per l'incoraggiamento, mi hai calmato un po'....

Ma ancora soffro di ripetute osservazioni sulla mancanza di logica nei miei codici.

E quello che mi fa incazzare più di tutto è che non riesco a capire di cosa esattamente stia parlando.

Mi sembra che l'assenza di logica booleana nel codice sia importante.

Ma come faccio a sapere se esiste o no?

Alexey mi ha detto che potrei avere problemi a causa di questo frammento (anche se il tester è OK).

se (ot==0)

se (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

In caso di un errore di codifica, tutto è chiaro - o me lo dirà MetaEditor o Log del terminale.

E se mi manca la logica ....... come posso saperlo? Solo con un suggerimento di compagni più esperti.

Ma anche dopo il loro suggerimento non capisco di cosa si tratti esattamente.

Studiare l'algebra booleana è irreale per me.

 

Dimentica l'algebra booleana e non tirarla più fuori.

Un aneddoto:

Un professore psichiatra ha visitato un ospedale per malati mentali e ha chiesto al primario come fanno a determinare se un paziente è guarito o è ancora malato.

- Riempiamo la vasca d'acqua, mettiamo una tazza da tè con un cucchiaio sul bordo e offriamo al paziente di rimuovere l'acqua.

- Dobbiamo supporre che se il paziente sta bene, prende la tazza e non il cucchiaio?

- Se il paziente è sano, si tira la spina nella vasca.

* * *

Dovreste essere in grado di rispondere alla vostra domanda se le azioni che state cercando di fare nel codice sono ragionevoli, e non è una domanda così difficile.

Open[1]-Close[1] può essere negativo. Quindi per il caso di Close>Open c'è un'opzione, per il caso di Close<Open c'è un'altra opzione. Oppure si dovrebbe calcolare la dimensione del corpo in modo che non dipenda dalla direzione della candela.

 
solnce600:

Boris! Grazie per il tuo sostegno, mi hai calmato un po'....

Ma ancora mi è stato ripetutamente detto che non c'è logica nei miei codici.

E quello che mi fa incazzare di più è che non riesco a capire di cosa esattamente stia parlando.

Mi sembra che l'assenza di logica booleana nel codice sia importante.

Ma come posso sapere se c'è o no?

Alexey ha detto che è assente in questo frammento e che potrei avere problemi a causa di questo frammento (anche se il tester è OK).

se (ot==0)

se (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

In caso di un errore nella codifica tutto è chiaro - o me lo dirà MetaEditor o Terminal Log.

Ma se mi manca la logica ......., come posso saperlo? Solo con un suggerimento di colleghi più esperti.

Ma anche dopo i loro suggerimenti non capisco di cosa sto parlando.

Imparare l'algebra booleana è irreale per me.

"Per prima cosa, renderò il tuo codice leggibile, rimuoverò le parentesi e le condizioni inutili, e poi potrai dirmi perché hai bisogno di quelle condizioni!

if (ot==0)                    //если Buy, значит эти условия для закрытия или модификации?!

if (Bid==Price)               //это не будет работать на Реале! 
                              //Надо так: (Bid>=Price) или (Bid<=Price) в зависимости от направления
if(Open[1]-Close[1]>100*Point && Open[1]-Close[1]<120*Point)
if(High[1]-Open[1]>40*Point && High[1]-Open[1]<60*Point)  

if(Close[1]-Low[1]>40*Point && Close[1]-Low[1])<60*Point) 

 
borilunad:

"Prima renderò il tuo codice leggibile, rimuoverò le parentesi inutili e le condizioni superflue, e poi tu mi dirai perché hai bisogno di quelle condizioni!

Vi dico perché ho bisogno di queste condizioni inutili.

Ho bisogno delle condizioni che hai inviato al forno, così il programma calcola i parametri specifici della candela con uno scarto di 1 punto.

Cioè una candela ribassista con una dimensione specifica del suo corpo, con una dimensione specifica tra i prezzi aperti e bassi, con la dimensione specifica della distanza tra i prezzi bassi e chiusi.

Capisco che per questo scopo, se non mi sbaglio, si può anche usare NormalizeDouble (MathAbs ()), ma non ho notato una differenza tra questa variante e quella che ho usato.

 
solnce600:

Vi dico a cosa mi servono quelle condizioni extra.

Le condizioni che mi hai mandato al forno, ho bisogno del programma per calcolare i parametri specifici della candela +, - 1 punto.

Cioè una candela ribassista con una dimensione specifica del suo corpo, con una dimensione specifica tra il prezzo aperto e il prezzo basso, con la dimensione specifica della distanza tra il prezzo basso e il prezzo di chiusura.

Capisco che per questo scopo, se non mi sbaglio, si può anche usare NormalizeDouble (MathAbs ()), ma non ho notato una differenza tra questa versione e quella che ho usato.

Allora vedi sopra, corretto!
 
Integer:

Dimentica l'algebra booleana e non tirarla più fuori.

Un aneddoto:

Uno psichiatra ha visitato un ospedale per malati mentali e ha chiesto al primario come fanno a determinare se un paziente è guarito o è ancora malato.

- Riempiamo la vasca d'acqua, mettiamo una tazza da tè con un cucchiaio sul bordo e offriamo al paziente di rimuovere l'acqua.

- Dobbiamo supporre che se il paziente sta bene, prende la tazza e non il cucchiaio?

- Se il paziente è sano, tira il tappo nella vasca.

* * *

Dovreste essere in grado di rispondere alla vostra domanda se le azioni che state cercando di fare nel codice sono ragionevoli, e non è una domanda così difficile.

Open[1]-Close[1] può essere negativo. Quindi per il caso di Close>Open c'è un'opzione, per il caso di Close<Open c'è un'altra opzione. Oppure si dovrebbe calcolare la dimensione del corpo in modo che non dipenda dalla direzione della candela.

Grazie per l'aneddoto.....d'ora in poi cercherò di pensare solo alla spina.

Ma comunque... quando persone rispettabili di questo ramo dicono ripetutamente e simultaneamente sull'assenza di logica nel mio codice.... come si scopre più tardi l'algebra booleana - significa sputare sull'autorità dei professionisti seri di questo ramo..... non mi innalzerò immediatamente ad esso.... e potrebbe non innalzarsi affatto..... non ho ancora provato.

 
borilunad:
Allora vedi sopra, corretto!

Quindi avevo molte parentesi in più? Sono dannosi?!

Beh, se il compilatore non mi ha dato un errore quando ho inserito queste parentesi .... ho pensato che fosse tutto ok.

Ho pensato fino a poco tempo fa che se il compilatore non si lamentava e l'EA funzionava nello Strategy Tester in conformità con il suo codice, allora era OK.

Sembra che non sia proprio così.....

 
solnce600:

Boris! Grazie per il tuo sostegno, mi hai calmato un po'....

Ma ancora mi è stato ripetutamente detto che non c'è logica nei miei codici.

E quello che mi fa incazzare di più è che non riesco a capire di cosa esattamente stia parlando.

Mi sembra che l'assenza di logica booleana nel codice sia importante.

Ma come posso sapere se c'è o no?

Alexey mi ha detto che è assente in questo frammento e che potrei avere problemi a causa di questo frammento (anche se il tester è OK).

se (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

In caso di errore nella codifica tutto è chiaro - o MetaEditor me lo dirà o Terminal Log.

Ma se mi manca la logica ......., come faccio a saperlo? Solo con un suggerimento di colleghi più esperti.

Ma anche dopo i loro suggerimenti non capisco di cosa sto parlando.

Studiare l'algebra booleana è irreale per me.


Non c'è bisogno di essere un esperto di algebra booleana per enunciare chiaramente i termini...

Lascia che ti renda le cose un po' più facili... Sostituite if con il solito if, else con otherwise, && con and, || con or , ecc. Poi sarete in grado di leggere con le vostre parole normali ciò che è scritto o decidere cosa volete scrivere.

Quello che hai scritto (saltiamo la descrizione errata delle condizioni per ora):

1. if (ot==0) Se non ci sono ordini a mercato (né ordini a mercato, né pendenti, né aperti da questo EA, da un altro EA o manualmente)... Se sì, viene eseguita la linea 2, se no, si passa alla linea 3.

2. if (Bid==Price) Se il prezzo è uguale al prezzo di apertura della candela corrente... Se lo è, allora viene eseguita la linea 3, altrimenti si passa alla linea 4.

3. if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point)) Se il prezzo di apertura della prima candela è superiore al prezzo di chiusura della prima candela di più di 100 punti e meno di 120 punti... Se lo è, vai alla linea 4, altrimenti vai alla linea 5.

4. if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point)) Se il massimo della prima candela è superiore al prezzo aperto della prima candela di più di 40 punti e meno di 60 punti... Se lo è, allora eseguiamo la linea 5, altrimenti andiamo alla linea 6.

5. if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point)) Se la chiusura della prima candela è superiore al minimo della prima candela di più di 40 punti e meno di 60 punti. Se lo è, viene eseguita la linea 6, altrimenti si passa alla linea 7.

6.

7.

Come si può vedere da questa decomposizione, o si fanno eseguire tutte le linee di codice una dopo l'altra (nel caso in cui ogni linea restituisca true), o si salta la linea che viene dopo la linea che restituisce false.

Per evitare confusione nei vostri termini, e per comporre correttamente la vostra logica, racchiudete tutte le dichiarazioni tra parentesi graffe, indipendentemente dal fatto che una singola linea debba essere eseguita dopo il valore di verità, o un intero blocco.

Per esempio:

if (ot==0) {
   if (Bid==Price) {
      // сюда можно вписать целый блок, который будет исполняться лишь при одном условии, что bid==Price
      // только вот вряд ли он когда-либо исполнится в реале
      }
   }
Quindi, prova a scomporre il tuo codice in componenti, rimuovendo le parentesi extra, che sono inutili in questo caso...
Motivazione: