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

 
Youri Lazurenko:

Lo tengo así - abriendo una orden con TP y SL cero, y luego modificando (la orden) con los parámetros TP y SL requeridos. Ya escribí, todo funciona y funcionó bien en otras cuentas, sólo en ndd tal cosa. No he trabajado con nadie más con cuentas similares antes, no puedo comparar. Tal vez sea sólo el pitido de forex4u, o tal vez todas las cuentas de ndd. Me gustaría saberlo para futuras referencias.
Como tienes un error de 130, entonces mira los parámetros de la orden de stop. En cualquier caso, no deberían estar más cerca del valor de StopLevel establecido en la configuración del servidor. Si es igual a cero, se utiliza la doble extensión+1 punto
 
Youri Lazurenko:

Lo tengo así - abriendo una orden con TP y SL cero, y luego modificando (la orden) con los parámetros de TP y SL correctos. Ya escribí, todo funciona y funcionó bien en otras cuentas, sólo en ndd tal cosa. No he trabajado con nadie más con cuentas similares antes, no puedo comparar. Tal vez sólo sea el pitido de forex4u, o tal vez todas las cuentas de ndd. Me gustaría saber para más información.

Al abrir posiciones, utilice estas funciones para calcular los topes y las tomas correctas:

//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
 
Alexey Viktorov:

¿Cuál es la diferencia?

Pips = Carga/Lotes/Valor de los Pips en cifras concretas 8/2/4 = 1

o

Pips = Carga/(Lotes*Valor de la Tic) en números concretos 8/(2*4) = 8/8 = 1

Los números fraccionarios también pueden utilizarse...


La diferencia es que mi homónimo también multiplica porPunto por alguna razón:(OrderCommission()/(tv*OrderLots()))*Punto()
 
Artyom Trishkin:
Si tiene el error 130, entonces mire los parámetros de la orden de parada. En cualquier caso, no deben estar más cerca que el valor de StopLevel establecido en la configuración del servidor. Si es igual a cero, se utiliza el doble de la extensión + 1 punto


Muchas gracias por las características dadas, en tu siguiente post.

El caso es que no tengo ningún stop puesto (promediando). Y por qué este error no está presente cuando arranco el terminal por la mañana y se produce la modificación, pero sólo está presente (error) al inicio de la sesión cuando se abre una orden (gráficos diarios) y si es una sobre un par. El servicio técnico ha respondido que no hay limitaciones para esta modificación ni en tiempo ni en distancia (la dispersión no es importante).

Intentaré hacer algunos experimentos con todas las recomendaciones y sacaré mis conclusiones más adelante.

Muchas gracias una vez más.

 
Vitalie Postolache:

La diferencia es que mi homónimo también multiplica por Punto por alguna razón:(OrderCommission()/(tv*OrderLots()))*Punto()

OK, voy a responder: Hay un precio de 1,0520, en los cálculos obtuvimos el número (int)Comm, entonces tenemos que sumar / restar del precio = 1,0520 + (int)Comm ? Ahora, para no multiplicar por Punto - esto se hace inmediatamente.

 
Youri Lazurenko:


Muchas gracias por las características dadas, en tu siguiente post.

El caso es que no tengo paradas (promediadas) puestas en absoluto. Y por qué este error no está presente cuando arranco el terminal por la mañana y se produce la modificación, pero sólo está presente (error) al inicio de la sesión cuando se abre una orden (gráficos diarios) y si es una sobre un par. El servicio técnico ha respondido que no hay limitaciones para esta modificación ni en tiempo ni en distancia (la dispersión no es importante).

Intentaré hacer algunos experimentos con todas las recomendaciones y sacaré mis conclusiones más adelante.

Muchas gracias una vez más.

De nada.

Para utilizarlo: En la función de apertura de posición, en lugar del stop en pips, copie la llamada a la función, en la que sustituye el stop en pips. O el precio de parada debe introducirse directamente - el compilador seleccionará la función requerida. Lo mismo para el take profit.

Ejemplo:

double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);         // Цена открытия для Buy
double sl=CorrectStopLoss(Symbol(), OP_BUY, price, 200);    // Стоп в 200 пунктов (вместо пунктов можно вписать расчётную цену, например Ask+200*Point() или значение цены МА)
double tp=CorrectTakeProfit(Symbol(), OP_BUY, price, 300);  // Тейк в 300 пунктов (если вписать расчётную цену, то будет использоваться тип функции с double-параметром)
OrderSend(Symbol(),OP_BUY,Lots,price,slippage,sl,tp,"Комментарий ордера",Magic,0,clrBlue);
 
Vitaly Muzichenko:

OK, voy a responder: Hay un precio de 1,0520, en los cálculos obtuvimos el número (int)Comm, entonces tenemos que sumar / restar del precio = 1,0520 + (int)Comm ? Ahora, para no multiplicar por Punto - esto se hace inmediatamente.


Bueno, entonces tal vez sí. Es que la pregunta se planteó originalmente como traducir la comisión en pips, no en precio.
 
Artyom Trishkin:

De nada.

Utilice esta forma: En la función para abrir una posición en lugar del stop en pips, escriba la llamada de la función en la que desea sustituir el stop en pips. O el precio de parada debe introducirse directamente - el compilador selecciona la función requerida. Lo mismo para el take profit.

Ejemplo:

Una vez más, muchas gracias. Todo lo mejor.
 
Por favor, aconsejen Estimados señores: Dibujo las líneas de Fibonacci con diferentes colores y niveles de estilo y siempre se pone la misma que la última, ¿cómo arreglarlo?

                  ObjectCreate(0,Fibo_Arrow,OBJ_FIBO,0,Time[0],Close[0],Time[0],price); // создание метки стпа на графике   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_HIDDEN,true);        // Запрет на показ имени графического объекта в списке объектов 
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_SELECTABLE,false);   // запрет на выделение перемещение объекта мышью   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_RAY_RIGHT,false);    // луч вправо
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_TOOLTIP,"r\n");       // подпись линии и и её длины в подсказку                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_COLOR,1,clrNONE);       // цвет   
                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELS,3);           // установим количество уровней   
                      
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,0,1.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,0,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,0,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,0,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,0,"0.5"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,1,2);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,1,Lime);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,1,0);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,1,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,1,"1"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,2,2.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,2,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,2,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,2,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,2,"1.5"); // описание уровня 
 
Money_Maker:
Estimados expertos, por favor aconsejen: Construyo líneas de Fibonacci con diferente color y estilo de niveles, pero siempre se establece el mismo que el último, ¿cómo arreglar? redibujar y deslizar no es útil en ningún lugar(

Los niveles de Fibo con este objeto, no puede hacer diferentes estilos y colores para cada línea. Dibuja líneas separadas si quieres un arco iris.
Razón de la queja: