Precio por punto - página 3

 

Hehe otro cliente feliz :)- mientras estamos en ello, LEHayes mente darme ayuda en el cálculo de la gestión del dinero en porcentaje sin redondear los pips. Esto es lo que utilizo actualmente cuando quiero apostar el 1% del capital de mi cuenta:

double Profit_F=0.00001,Lots=0.1;
Lots=NormalizeDouble((AccountEquity()*Profit_F),1);
si (Lotes < 0,1) Lotes=0,1;
si (Lotes > 1,0) Lotes=1,0;

Esto funciona bien para mi stoploss de 100 cuando tengo un $10,000 por ejemplo. Como $10,000 X 0.00001 = 0.1 Lote. Pero cuando tengo $15,000 el tamaño del lote ahora es igual a 0.15, pero redondea a 2.0 tal vez porque mi corredor no permite macro lotes. ¿Cómo puedo forzar que se quede en 0.1 hasta que la equidad llegue a $20,000? Llevo mucho tiempo despierto, después de leer tu hilo, estoy muy cansado para buscar y estudiar. Si usted tiene otra ecuación para calcular mm por favor proporcionar en su lugar.

 
LEHayes:

Esto me está volviendo loco, he estado buscando desde hace meses un algoritmo existente que no haga más que calcular el Precio por Pip, independientemente del par en el que se encuentre. He encontrado 2 estrategias de gestión de dinero realmente buenas que dependen de este valor como una forma de precalcular el tamaño de las operaciones y la gestión del riesgo del dinero, pero no puedo encontrar un solo ejemplo de un cálculo que maneje el Precio por Pip.

Estoy dispuesto a ofrecer mi sistema de gestión de dinero a usted a cambio de esto en una función. Le proporcionaré las dos técnicas sugeridas por los mentores con los que he estado trabajando.


En primer lugar, tenemos que reconocer que hay cinco tipos básicos de símbolos. Esto es importante cuando se trata de cuestiones como el cálculo de tick_value, el apalancamiento, etc.

No hay una definición formal del tipo de símbolo, pero para una cuenta denominada en USD, aquí es cómo enumero los tipos de símbolo: (estos son ejemplos específicos, no todos incluidos)
            SymbolType 1:  Symbol() = USDJPY
                           
                           Base = USD
                           Counter = JPY
            
            SymbolType 2:  Symbol() = EURUSD
                           
                           Base = EUR
                           Counter = USD

            SymbolType 3:  Symbol() = CHFJPY
                           
                           Base = CHF
                           Counter = JPY
                           
                           USD is base to the base currency pair - USDCHF
                           
                           USD is base to the counter currency pair - USDJPY
            
            SymbolType 4:  Symbol() = AUDCAD
                           
                           Base = AUD
                           Counter = CAD
                           
                           USD is counter to the base currency pair - AUDUSD
                           
                           USD is base to the counter currency pair - USDCAD
            
            SymbolType 5:  Symbol() = EURGBP
                           
                           Base = EUR
                           Counter = GBP
                           
                           USD is counter to the base currency pair - EURUSD
                           
                           USD is counter to the counter currency pair - GBPUSD

La relevancia es cómo la denominación de la cuenta está relacionada con la moneda base y la contra moneda del instrumento financiero de interés. Es lo mismo para los CFD's que para los pares de divisas.

Una vez que se tiene el tipo de símbolo se puede calcular el apalancamiento por instrumento financiero - por ejemplo aquí está el código necesario para calcular el apalancamiento para AUDCAD:

CalculatedLeverage=NormalizeDouble(MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(CalculatedBasePairForCross,MODE_BID)+MarketInfo(CalculatedBasePairForCross,MODE_ASK))/(2*MarketInfo(Symbol(),MODE_MARGINREQUIRED)),2)
En este ejemplo la función de llamada que codifiqué ya habría determinado que para AUDCAD el CalculatedBasePairForCross es AUDUSD:
CalculatedBasePairForCross=StringConcatenate(SymbolBase,AccountCurrency(),postfix);
Y el SymbolBase (que es la moneda base del instrumento financiero Symbol()) es:
SymbolBase=StringSubstr(Symbol(),0,3);
Y así sucesivamente.

Para calcular el valor de los ticks es necesario tener en cuenta el tipo de símbolo, ya que esto importa cuando la valoración cambia tanto en el instrumento financiero de interés -Symbol() - como en el par de divisas de conexión que lleva a la denominación de la cuenta. Siguiendo con el ejemplo anterior, en el que estamos hablando del tipo de símbolo 4 - AUDCAD cuando la cuenta está denominada en USD - el valor del tick se define explícitamente como:

CalculatedTickValue=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_LOTSIZE)/MarketInfo(CalculatedCounterPairForCross,MODE_BID)
Donde la variable CalculatedCounterPairForCross para AUDCAD se determinó previamente como USDCAD:
CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);
Y SymbolCounter fue determinado por:
SymbolCounter=StringSubstr(Symbol(),3,3);

Al programar el cálculo de estos valores explícitamente de esta manera usted puede hacer determinaciones de información de mercado agnóstica del corredor.

Tenga en cuenta que el código aquí sólo es útil para symboltype = 4 en el que la moneda de denominación de la cuenta es la moneda del contador cuando se empareja con la moneda base de Symbol() y, del mismo modo, la moneda de denominación de la cuenta es la moneda base cuando se empareja con la moneda del contador que forma el par Symbol().

(AUDCAD -> AUDUSD & USDCAD)

Resulta que, aunque hay cinco tipos de símbolos universales, sólo es necesario categorizar cuatro de ellos para calcular el apalancamiento, el margen y el valor del tick. Y las matemáticas sólo se convierten en un punto de fricción específico cuando se trata de pares de divisas cruzadas en relación con la denominación de la cuenta.

Elaboré las relaciones específicas entre todas las combinaciones de base y contraparte porque mi enfoque de gestión del dinero es definir explícitamente el valor en riesgo de pérdida para cada operación y eso requiere saber exactamente el valor del precio al que hay que salir de la operación para que la pérdida se ajuste al presupuesto de pérdidas previamente definido. En el caso de los pares cruzados, resulta naturalmente que el valor en riesgo se basa en el precio de los dos pares de divisas en un instante determinado (a menos que se cubra contra uno u otro).

¿Sirve de algo esta información?

 
cloudbreaker:

TICKVALUE, cuando se utiliza por sí solo, puede ser poco fiable.

Sería interesante saber a qué corredor(es) se aplica esto, o si hay otras consideraciones como estar alrededor de la apertura/cierre del mercado. Nunca he sido capaz de replicar estos hallazgos suyos.

 
Ja, ja. Me doy cuenta de eso jjc. Pero no está de más usar la proporción. La mayoría de las veces estaremos dividiendo por 1. Más vale prevenir que lamentar ¿eh? CB
 
1005phillip:

¿Ayuda esta información en algo?

Nunca me había fijado en la distinción que haces entre el tipo de símbolo 3-5 (o quizás no lo he pensado en este contexto). En cualquier caso, es una buena idea para reflexionar... Felicidades por el excelente resumen.
 

wow nunca me di cuenta de que había tanto para calcular el valor de un pip, en mi EA lo hice por dejar que el ea calcular utilizando la primera orden abierta si se trata de una compra, el precio de oferta actual - orden de precio abierto / beneficio de la orden = valor del pip en la moneda base actual, o si se trata de una venta, currentask + openprice / beneficio de la orden = valor del pip, es esto no va a funcionar correctamente?

Edito: Me he dado cuenta de que lo he escrito al revés, quería decir beneficio de la orden/(oferta actual-precio abierto)=valor del pip

 
SDC:

wow nunca me di cuenta de que había tanto que calcular el valor de un pip, en mi EA lo hice dejando que el ea lo calculara usando la primera orden abierta si es una compra, precio de oferta actual - precio de apertura de la orden / beneficio de la orden = valor del pip en la moneda base actual, o si es una venta, precio de oferta actual + beneficio de la orden = valor del pip, ¿esto no va a funcionar correctamente?


Ese cálculo es válido en el límite de que cada pip tiene la misma valoración independientemente del precio actual de compra o venta.

Esto es rigurosamente cierto para los pares de divisas que son de tipo símbolo = 2 como los definí anteriormente, es decir, EURUSD, etc. (cualquier par de divisas en el que la denominación de la cuenta es la contra-divisa del par).

Para la mayoría de la gente las diferencias no son importantes, los errores resultantes son pequeños. En mi caso, quería calcular los valores de forma robusta con expresiones analíticas correctas.

Por ejemplo, si presupuesto $ 200 para la pérdida máxima posible en un próximo comercio y mis paradas se establecen en 200 puntos, entonces quiero saber el tamaño del lote para mi orden de tal manera que mis pérdidas no pueden exceder de $ 200 ... para ser robusto acerca de esto debo calcular la valoración de pip correctamente en el punto del precio de stoploss. No es una opción aceptable para mí o mis clientes ;)
 

Me alegro de que LEHayes lo haya solucionado todo. Y Phillip, has desmitificado completamente TickValue y los pares de diseño-sintetizados muy bien para que todos se beneficien. ¡Genial!

Sólo me gustaría añadir: las operaciones de sintetización ...

CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);

SymbolCounter=StringSubstr(Symbol(),3,3);

... necesitan tener cuidado con el apéndice extra como USDJPYm en algunos corredores de mini-lote. No sé si un broker puede/alguna vez alterar las primeras seis letras de los símbolos poniendo o añadiendo una letra delante o entre la base y el contador, si buscas robustez, IMO leer desde un archivo .set o .sel es una apuesta más segura.

 
cameofx:

Me alegro de que LEHayes lo haya solucionado todo. Y Phillip, has desmitificado completamente TickValue y los pares de diseño-sintetizados muy bien para que todos se beneficien. ¡Genial!

Sólo me gustaría añadir: las operaciones de sintetización ...

CalculatedCounterPairForCross=StringConcatenate(AccountCurrency(),SymbolCounter,postfix);

SymbolCounter=StringSubstr(Symbol(),3,3);

... necesitan tener cuidado con el apéndice extra como USDJPYm en algunos corredores de mini-lote. No sé si un broker puede/alguna vez alterar las primeras seis letras de los símbolos poniendo o añadiendo una letra delante o entre la base y el contador, si buscas robustez, IMO leer desde un archivo .set o .sel es una apuesta más segura.


Sin embargo, no estoy buscando ese tipo de solidez cuando hablo de cálculos robustos.

Los brokers pueden nombrar sus pares de divisas como quieran, uno esperaría que tuviera la presencia de ánimo para darse cuenta de ello y modificar mis códigos en consecuencia antes de intentar operar en vivo con un nuevo broker usando el símbolo de divisa lovelyUSDmoonCADcheese! :P

Este código simplemente se ocupa de 100% de los casos que he encontrado hasta ahora (Alpari, CitiFX, CMS forex, forex.com, FXCM, FXDD, IBFX, MIG, y ODL) ... No estoy preocupado por lo que es a prueba de futuro, simplemente la prueba actual. Ahora bien, si tienes algo en mente para hacerlo a prueba de futuro... pues ahora es un buen momento para decir lo que piensas :)

 

lovelyUSDmoonCADcheese! ...

¡Lol! He visto que el broker ha escrito mal la descripción del Symbol en la propiedad del símbolo (no el parámetro Symbol() pero ¡también tienen que escribir este en algún momento!) ¡Quién sabe! :))

No puedo decir si alguna vez sería 100% infalible (¿qué es?). Pero estoy pensando en algo como esto :

  • crear una lista/inventario de posibles nombres de bases/contenedores de 3 letras en mayúscula.
  • Leer la cadena de pares de .set o .sel.
  • Buscar una posible coincidencia desplazando una letra a la vez. Ignorando la aceptación de posibles combinaciones de mayúsculas/minúsculas (el valor ASCII diferiría en x enteros, hay que comprobarlo) podemos usar un bucle para convertir todas las letras en mayúsculas, por ejemplo.
  • Si se encuentra una coincidencia, guárdela como el nombre de 'broker'/'alias' en lugar del nombre de 'inventario' que tenemos. Continuar buscando la segunda parte del par y hacer lo mismo.
  • necesitamos comprobar también si un nombre de base / contador es consistente a través de al Symbol(). Y guardar sus 'alias' también.
  • utilizar los alias para sintetizar el par.
  • si un nuevo nombre de base/contador es alterado o añadido. Añadirlo a los alias.

Gordon hace algún tiempo me ofrece su opinión sobre qué méritos tendría una comprobación automática a prueba de errores en un EA. Teniendo esto en cuenta (& respetando eso) sigo pensando que esto puede ser algo que valga la pena, ¡incluso sólo por el gusto de hacerlo! :)