Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 884

 

Buenas tardes, señores. )) disculpas por el amateurismo...

No entiendo cómo funciona OrderClose :(

Necesito un máximo de 1 pedido, es decir, antes de abrir uno nuevo, quiero que se cierre el anterior...

¿Por qué no funciona así?


OrderClose(nom, 0.01, Bid,5, Red);

OrderSend(Symbol(), OP_SELL, 0.01 , NormalizeDouble(Bid,5), 3 , NormalizeDouble(Ask+0.0005,5), NormalizeDouble(Bid-0.0008,5), "", nom,0,Red);


el registro está básicamente jurando sobre un billete inválido .

en OrderClose en lugar de nom, ¿qué debo poner? o estoy pensando en la dirección equivocada en absoluto)

 
Sergey Voytsekhovsky:

Pruebe minStopLoss = Precio actual +/- (MaxValue(2*Spread, StopLoss));

Lo he probado. Dos spreads es 24, no funcionará así, empieza a funcionar a 19 del precio de cierre. A partir del precio de apertura actual trabaja con tres spreads.
Aumenté el stop en un punto del bucle y abrí una orden. Se abrió por 19. La cuestión no es cómo fijarlo. La cuestión es cómo calcular correctamente. No hay precios; aparecen durante la apertura manual de una orden si se establece el stop con el botón de stop. Esto es ridículo. Estoy inspeccionando todo el foro. He encontrado algunas funciones en la 7ª página (mensaje #65). Te avisaré cuando lo compruebe.

 
Sergey Voytsekhovsky:

Lo he estudiado, pero nada nuevo, aparentemente es (nuevo para mí) por supuesto, obvio para todos los iniciados, autoexplicativo. No pude encontrar nada nuevo, excepto la característica descrita anteriormente de la disposición mutua de los búferes durante la indexación. Esta secuencia respetada, obtuvo una imagen aún más cursi.

Fotos abajo, archivo adjunto

Quizá tengas muy mala suerte, pero no me gusta hurgar en el código de los demás. Más aún cuando se trata de arreglarlo...

La siguiente pregunta: ¿con qué frecuencia crees que el valor del indicador será exactamente 50?

         ColorHistogram_2Buffer1[i]=50; 

Según he entendido el problema, debería ser un color >50 y otro <50, pero no he visto ==50. Por supuesto, para eliminar la pérdida en el caso ==50, debemos añadir a una de las comparaciones >=50 u otra <=50, según lo permita la religión. Puede parecer mejor.

Y la segunda pregunta: ¿cuántas veces crees que ha sido necesario cambiar toda la indexación de los buffers? Después de reindexar, ¿arreglaste todo en el código exactamente? Tal vez sería más fácil hacer el índice de la memoria intermedia de color 4, y las memorias intermedias auxiliares 5 y 6 en consecuencia. Habría menos necesidad de editar y menos posibilidades de cometer más errores.

 
klok79:
Lo he probado. Dos spreads es 24, no funcionará así, empieza a funcionar a 19 del precio de cierre. A partir del precio abierto actual trabaja con tres spreads.
Aumenté el stop en un punto del bucle y abrí la orden. A los 19 años se abrió. No es una cuestión de cómo elegir. La cuestión es cómo calcularlo correctamente. No hay precios que aparezcan cuando abro una orden manualmente si pongo un stop con el botón. Esto es ridículo. Estoy haciendo una lectura masiva de este foro. He encontrado algunas funciones en la 7ª página (mensaje #65). Tendré que comprobarlo e informar.

Comprobado. Obras
Todo esto es extraño, dice lo mismo minStopLoss = Current Price +/- (max value(2*Spread, StopLoss)), sólo que bajo Current Price entendemos no el precio abierto de la orden sino el precio espejo.
¿Por qué es adecuada la doble difusión?
Se plantean dos cuestiones más.
1. ¿Por qué se utiliza SymbolInfoInteger para obtener los valores de Digits() y Point()?
2. ¿Por qué se utiliza una entrada (int) antes de llamar a la función SymbolInfoInteger? Según tengo entendido, se trata de una conversión de tipo forzado.

 
klok79:

Lo he comprobado. Funciona
Todo esto es raro, siguen escribiendo lo mismo minStopLoss = Current Price +/- (maxZen(2*Spread, StopLoss)) pero el Current Price no es el precio de apertura de la orden sino el precio espejo.
¿Por qué es adecuada la doble difusión?
Se plantean dos cuestiones más.
1. ¿Por qué se utiliza SymbolInfoInteger para obtener los valores de Digits() y Point()?
2. ¿Por qué se utiliza una entrada (int) antes de llamar a la función SymbolInfoInteger? Según tengo entendido, se trata de una conversión de tipo forzado.

Para obtener Point() SymbolInfoInteger no funcionará de ninguna manera).

En general, es necesario recordar que Point() o _Point es sólo para el símbolo actual. Para otros caracteres distintos a los que trabaja el EA, hay que utilizar esta misma función.

La función SymbolInfoInteger no sólo devuelve valores int, sino también long, bool y enumeraciones.

 

Sergey Voytsekhovsky, gracias por su ayuda. Y una pregunta más, si no te importa, por favor, sugiéreme la función inversa a la funciónCharToStr
(para obtener su código a partir de un símbolo), porque tengo funciones para ello en Beisic y Delphi, pero en C++, que yo sepa, hay dos métodos:
1 - FunciónAscii_cod, que no está en mql4
2. - Conversión directa del tipo. Pero mi código es
string st="A";
Imprimir ("Código de carácter A=",(int)st);

Salida de texto Código de caracteres A=0.

¿Qué hacer?

 
klok79:

Sergey Voytsekhovsky, gracias por su ayuda. Y una pregunta más, si no te importa, ¿podrías sugerir la función inversa deCharToStr
(para obtener su código a partir de un símbolo), porque tengo funciones para ello en Beisic y Delphi, pero en C++, según tengo entendido, hay dos métodos:
1 - FunciónAscii_cod, que no está en mql4
2. - Conversión directa del tipo. Pero mi código es
string st="A";
Imprimir ("Código de carácter A=",(int)st);

Salida de texto Código de caracteres A=0.

¿Qué hacer?

StringToCharArray, a diferencia de la función wiki, no convierte sólo un carácter a la vez, sino que puede convertir una cadena en un array de tipo ucar con los códigos de todos los caracteres de la cadena.

mql4 también tiene esa función.

Документация по MQL5: Преобразование данных / StringToCharArray
Документация по MQL5: Преобразование данных / StringToCharArray
  • www.mql5.com
Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов. [in]  Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо...
 
Alexey Viktorov:

Para obtener Point() SymbolInfoInteger no funcionará de ninguna manera).

En general, es necesario recordar que Point() o _Point es sólo para el símbolo actual. Para otros caracteres distintos a los que trabaja el EA, debe utilizar esta función.

La función SymbolInfoInteger no sólo devuelve valores int, sino también long, bool y enumeraciones.

En realidad Point tiene valor doble. Esto significa que debemos llamarlo desde SymbolInfoDouble

 
Konstantin Nikitin:

Bueno, en realidad Point tiene un valor del doble. Significa que la solicitud debe ser realizada por SymbolInfoDouble

Se trata de estas funciones para MQL4 del post #65:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+

No he visto dónde se obtiene Point mediante SymbolInfoInteger()

 
Artyom Trishkin:

Se trata de esas funciones MQL4 del post #65:

No he visto dónde se obtiene Point mediante SymbolInfoInteger()

Sí, lo mismo. Nos hemos deslizado a través de él. Lo principal es que entienda lo que es...

Razón de la queja: