[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 82

 
nemo811:
Gracias por la ayuda. Entendí la lógica de poner la bandera y la función de devolver el número de pedidos. Pero también me interesa el momento en que se cierra la orden. Parece que la condición de la bandera trata de colocar una orden de nuevo, pero la función que devuelve el número de orden dice que ha disminuido en 1 e inicializa la apertura de una posición también. Corríjanme si me he perdido algo.


En el código que usted proporcionó, la condición está en un lugar (BUY=true) y hasta que la bandera cambie, la reapertura no ocurrirá...porque la llamada a la función para abrir una posición viene de este bloque de condición...Y la bandera en este código sólo puede cambiar después de que el EA se reinicie, cuando la variable con el valor true será inicializada.

O quizás no entiendo la pregunta:)

 
NameLess:


La bandera en este código puede cambiar sólo después de reiniciar el Asesor Experto, cuando la variable con el valor verdadero se inicializa.

o no entiendo la pregunta:)


Gracias, has acertado. Lo pondré en práctica ahora.
 
NameLess:


Esta es la versión que resultó funcionar. Muchas gracias a ti y 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, nada ayuda! No puedo obtener un valor con 5 decimales. he probado todas las opciones que se me ocurren, he traducido una cadena a un número, he traducido una subcadena a un número, he quitado dígitos (ejemplo anterior) y los he sumado estúpidamente uno a uno, más allá de 4 decimales simplemente no suma y empieza a redondear a 4 decimales. incluso he añadido el 6º decimal. aún así, no sirve(

¿Puede ser que Alert no muestre las variables dobles más allá del 4º signo? No sé qué pensar... algún tipo de misterio(

 

He escrito dos EAs vinculados entre sí (no operan, sólo crean gobales) y creo que puedo usarlos para hacer un indicador de gráfico de volumen equi similar al gráfico de precios regular en mt4. O si alguien ya ha utilizado algo similar, por favor comparta el código:)

Archivos adjuntos:
eqvol.rar  3 kb
 
NameLess:

¿Puede ser que Alert no muestre las variables dobles más allá del 4º dígito? (muestra la cadena completa) No sé qué pensar... algún tipo de misterio(

Sí. (al igual que Print) muestra los 4 dígitos estándar si sólo se emite un número.

Utilice DoubleToStr para ser más preciso.

 

Rrrrrrrrrrrrrr. correcto, el terminal en Alerta no muestra más allá de 4 caracteres. cambié el doble de vuelta a la línea y lo saqué para mirar la pantalla - todo está correcto.

mataron medio día para esta tontería. tinny, y todo estaba funcionando inicialmente(

 
NameLess:

¡Gente, nada ayuda! No puedo obtener un valor con 5 decimales. he probado todas las opciones que se me ocurren, he traducido una cadena a un número, he traducido una subcadena a un número, he sacado números (ejemplo anterior) y los he sumado estúpidamente uno a uno, más allá del 4º decimal simplemente no suma y empieza a redondear al 4º decimal. incluso he añadido el 6º decimal. sigue fallando(

¿Puede ser que Alert no muestre más allá del 4º signo de la variable double? (La cadena muestra todo) Ya no sé qué pensar.

Bueno, como siempre todo queda en el experimento. Nosotros escribimos el guión:

#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);
}

Como podemos ver, hay una tarjeta dll conectada al script. Sólo tiene una función que elimina la parte fraccionaria del número. El archivo dll se adjunta a este post. Ahora debemos aplicar secuencialmente el script a 2 pares de divisas. Lo pongo en la libra y en el euro-japonés. En la libra, tengo 4 decimales. En el par de divisas euro-japonés - dos. Este es el resultado de la operación de script:

En la libra, puedes ver cómo la coma se mueve de forma consistente. Y también puedes ver que la última división deja 4 dígitos en la parte fraccionaria. Podemos suponer que como mis Dígitos = 4, el quinto dígito después del punto decimal está cortado. Así que el eurojaponés también debería acabar con sólo 2 dígitos después del punto decimal, ya que los dígitos en él = 2. Sin embargo, el experimento muestra que también da 4 dígitos después del punto decimal. Por lo tanto, nuestra suposición no es correcta y es posible que se produzca un redondeo. Intentemos sustituir los 4 últimos por 7. El resultado:

¿Qué vemos? El cinco resultante se convierte ahora en un seis. Por lo tanto, se produce un redondeo automático.

No sé cómo se comportará el script con el carácter de cinco dígitos, pero no quedé satisfecho con el trabajo con los caracteres de cuatro y dos dígitos: el terminal interfería y redondeaba sin que se le pidiera. Así que tengo que hacer preguntas a los desarrolladores. O - opción 2 - tomar las lecturas del indicador, ponerlas en una cadena, enviar la cadena a una dll, procesar los datos allí como necesitamos y devolver la orden de comercio desde la dll.

Archivos adjuntos:
experts.rar  42 kb
 

Información de la ayuda (Según la Alerta):

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

Ve a averiguar por qué los desarrolladores hicieron esto...

 
drknn:


Gracias, he estudiado el código, muy interesante. Todo, como he descrito anteriormente, resultó ser más simple: el terminal simplemente no muestra más allá de la 4ª cifra en la ventana. y todas las ideas funcionaron, sólo resolvió el problema de la conversión de diferentes maneras :)

zy. Una vez más, estoy convencido de que todos los problemas se resuelven de forma lógica, y aquí la situación era originalmente ilógica, por lo que estábamos buscando un obstáculo en el lugar equivocado :)