[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 82

 
nemo811:
Grazie per l'aiuto. Ho capito la logica di impostare il flag e la funzione di restituire il numero di ordini. Ma mi interessa anche il momento in cui l'ordine viene chiuso. Sembra che la condizione di bandiera provi a piazzare di nuovo un ordine ma la funzione che restituisce il numero d'ordine dice che è diminuito di 1 e inizializza anche l'apertura di una posizione. Correggetemi se mi sono perso qualcosa.


Nel codice che hai fornito, la condizione è in un posto (BUY=true) e finché la bandiera non cambia, la riapertura non avverrà... perché la chiamata alla funzione per aprire una posizione proviene da questo blocco di condizioni... E la bandiera in questo codice può cambiare solo dopo che l'EA viene riavviato, quando la variabile con il valore true sarà inizializzata.

O forse non capisco la domanda:)

 
NameLess:


Il flag in questo codice può cambiare solo dopo aver riavviato l'Expert Advisor, quando la variabile con il valore true viene inizializzata.

o non capisco la domanda:)


Grazie, hai capito bene. Lo implementerò ora.
 
NameLess:


Questa è la versione che ha funzionato. Molte grazie a te e a IgorM:

extern bool BUY = true;
extern int Magic = 0;
extern double Lot = 0.1;
extern int takeprofit = 0;
extern int stoploss = 0;
extern int slippage = 3; 
double SL,TP;
int init(){
return(0);
}
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");

BUY=false;
}

return(0);
}
void OPENORDER(string ord)
{
int ticket = -1;
while (ticket<0)
{
if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
Sleep(500);
}
return;
}
 

string Val="";
Val = iBands(NULL,0,50,2,0,PRICE_CLOSE,MODE_LOWER,0);
string substr=StringSubstr(Val,0,1);
point_low=StrToDouble(substr);
substr=StringSubstr(Val,2,1);
point_low+=StrToDouble(substr)/10;
substr=StringSubstr(Val,3,1);
point_low+=StrToDouble(substr)/100;
substr=StringSubstr(Val,4,1);
point_low+=StrToDouble(substr)/1000;
substr=StringSubstr(Val,5,1);
point_low+=StrToDouble(substr)/10000;
substr=StringSubstr(Val,6,1);
point_low+=StrToDouble(substr)/100000;

substr=StringSubstr(Val,7,1);
point_low+=StrToDouble(substr)/1000000; //тут плюсуем 6-ю цифру после запятой.

Gente, niente aiuta! Non riesco a ottenere un valore con 5 cifre decimali. ho provato tutte le opzioni possibili, ho tradotto una stringa in un numero, ho tradotto una sottostringa in un numero, ho tolto delle cifre (esempio sopra) e le ho stupidamente aggiunte una ad una, oltre le 4 cifre decimali non si aggiunge e comincia ad arrotondare a 4 cifre decimali. anche ho aggiunto la sesta cifra decimale. ancora, non va bene(

Può essere che Alert non visualizzi le variabili doppie oltre il quarto segno? Non so cosa pensare... una specie di mistero(

 

Ho scritto due EAs collegati tra loro (non fanno trading, creano solo gobals) e penso di poterli usare per fare un indicatore grafico di volume equi simile al normale grafico dei prezzi in mt4. O se qualcuno ha già usato qualcosa di simile, si prega di condividere il codice:)

File:
eqvol.rar  3 kb
 
NameLess:

Può essere che Alert non visualizzi le variabili doppie oltre la quarta cifra (mostra l'intera stringa) Non so cosa pensare... una specie di mistero(

Sì. Esso (come Print) visualizza le 4 cifre standard se viene emesso solo un numero.

Usa DoubleToStr per essere più preciso.

 

Rrrrrrrrrrrrrrrrrrr. giusto, il terminale in Alert non visualizza più di 4 caratteri. ho commutato il doppio sulla linea e l'ho tirato fuori per guardare lo schermo - tutto è corretto.

ha ucciso mezza giornata per questa sciocchezza. tinny, e tutto funzionava inizialmente(

 
NameLess:

Gente, niente aiuta! Non riesco a ottenere un valore con 5 cifre decimali. ho provato tutte le opzioni possibili, ho tradotto una stringa in un numero, ho tradotto una sottostringa in un numero, ho tolto delle cifre (esempio sopra) e le ho stupidamente aggiunte una ad una, oltre le 4 cifre decimali non si aggiunge e comincia ad arrotondare a 4 cifre decimali. anche ho aggiunto la sesta cifra decimale. ancora, non va bene(

Può essere che Alert non visualizzi più della 4a cifra della variabile double? (La stringa mostra tutto) Non so cosa pensare.

Bene, come sempre tutto sta nell'esperimento. Noi scriviamo la sceneggiatura:

#property copyright ""
#property link      ""
#include <Basic_dll.mqh>

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  string Stroka,Podstroka,SMB;
        int DGS,BezDrobi;
        double Rezult;
        SMB=Symbol();
        //DGS=MarketInfo(SMB,MODE_DIGITS);
        DGS=5;// дигитс задаём принудительно, чтоб можно было проверить на любой валюте
        // передаём левое значение в переменную
        Rezult=1.252546987;
        // возводим число в степень
        for(int i=1;i<=DGS;i++){
                Rezult=Rezult*10;
        }
        // В степень возвели. Теперь отбрасываем дробную часть.
        BezDrobi=OtbrosDrobnChasti(Rezult);// функция отбрасывает дробную часть числа
        Alert("BezDrobi = ",BezDrobi);
        // теперь ставим на место запятую
        Rezult=BezDrobi*1.0;
        for(i=1;i<=DGS;i++){
                Rezult=Rezult/10;
                Alert("Rezult = ",Rezult);
        }
        Alert("----------- ",SMB," -----------");
        return(0);
}

Come possiamo vedere, c'è una scheda dll collegata allo script. Ha solo una funzione che elimina la parte frazionaria del numero. Il file dll è allegato a questo post. Ora dovremmo applicare sequenzialmente lo script a 2 coppie di valute. L'ho messo sulla sterlina e sull'euro-giapponese. Nella sterlina, ho 4 cifre decimali. Sulla coppia di valute euro-giapponese - due. Ecco il risultato dell'operazione di script:

Nella sterlina, puoi vedere come la virgola si muove in modo coerente. E si può anche vedere che l'ultima divisione lascia 4 cifre nella parte frazionaria. Possiamo supporre che, poiché il mio Digits = 4, la quinta cifra dopo il punto decimale è tagliata. Quindi l'eurogiapponese dovrebbe anche risultare in solo 2 cifre dopo il punto decimale, poiché le cifre su di esso = 2. Tuttavia, l'esperimento mostra che anch'esso risulta in 4 cifre dopo la virgola. Quindi la nostra ipotesi non è corretta e potrebbe esserci un arrotondamento. Proviamo a sostituire gli ultimi 4 con 7. Il risultato:

Cosa vediamo? Il cinque risultante diventa ora un sei. Di conseguenza, l'arrotondamento automatico ha luogo.

Non so come si comporterà lo script sul carattere a cinque cifre, ma non sono stato soddisfatto del lavoro sui caratteri a quattro e due cifre - il terminale interferiva e arrotondava senza che gli venisse chiesto di farlo. Quindi devo fare domande agli sviluppatori. Oppure - opzione 2 - prendere le letture dell'indicatore, metterle in una stringa, inviare la stringa a una dll, elaborare i dati lì come abbiamo bisogno e restituire l'ordine di trading dalla dll.

File:
experts.rar  42 kb
 

Informazioni dall'aiuto (secondo l'allarme):

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr().

Vai a capire perché gli sviluppatori hanno fatto questo...

 
drknn:


Grazie, ho studiato il codice, molto interessante. Tutto, come ho descritto sopra, si è rivelato più semplice: il terminale semplicemente non visualizza oltre la quarta cifra nella finestra. e tutte le idee hanno funzionato, solo risolto il problema della conversione in modi diversi :)

zy. Ancora una volta sono convinto che tutti i problemi si risolvono logicamente, e qui la situazione era originariamente illogica, quindi cercavamo un intoppo nel posto sbagliato :)