Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 189

 
Youri Lazurenko:

Tenho-o assim - abrir um pedido com zero TP e SL, e depois modificar (o pedido) com os parâmetros TP e SL necessários. Eu já escrevi, tudo funciona e funcionou bem em outras contas, apenas na ndd tal coisa. Nunca trabalhei com ninguém com contas semelhantes antes, não posso comparar. Talvez seja apenas o bleeping da forex4u, ou talvez todas as contas da ndd. Gostaria de saber para referência futura.
Uma vez que você tem um erro de 130, então olhe os parâmetros de ordem de parada. Em qualquer caso, eles não devem estar mais próximos do que o valor StopLevel definido nas configurações do servidor. Se for igual a zero, então use spread duplo+1 ponto
 
Youri Lazurenko:

Tenho-o assim - abrir um pedido com zero TP e SL, e depois modificar (o pedido) com os parâmetros certos de TP e SL. Eu já escrevi, tudo funciona e funcionou bem em outras contas, apenas na ndd tal coisa. Nunca trabalhei com ninguém com contas semelhantes antes, não posso comparar. Talvez seja apenas o bleeping da forex4u, ou talvez todas as contas da ndd. Gostaria de saber para referência futura.

Ao abrir posições, use estas funções para calcular as paradas e tomadas corretas:

//+------------------------------------------------------------------+
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:

Qual é a diferença

Pips = Carga/Lotes/Tickvalue em números específicos 8/2/4 = 1

ou

Pips = Charge/(Lots*Tickvalue) em números específicos 8/(2*4) = 8/8 = 1

Números fracionários também podem ser usados...


A diferença é que meu nome também se multiplica porponto por algum motivo:(OrderCommission()/(tv*OrderLots()))*Point()
 
Artyom Trishkin:
Se você tiver erro 130, então olhe os parâmetros de ordem de parada. Em qualquer caso, eles não devem estar mais próximos do que o valor StopLevel definido nas configurações do servidor. Se for igual a zero, então use spread duplo + 1 ponto


Muito obrigado pelas características dadas, em seu próximo cargo.

A questão é que não tenho nenhuma parada definida (média). E porque este erro não está presente quando inicio o terminal pela manhã e ocorre a modificação, mas apenas presente (erro) no início da sessão ao abrir uma ordem (gráficos diários) e se é um em um par. O suporte técnico respondeu que não há limitações para esta modificação, nem no tempo nem na distância (a propagação não é importante).

Vou tentar fazer algumas experiências com todas as recomendações e tirarei minhas conclusões mais tarde.

Muito obrigado, mais uma vez.

 
Vitalie Postolache:

A diferença é que meu nome também se multiplica por ponto por algum motivo:(OrderCommission()/(tv*OrderLots()))*Point()

OK, vou responder: Há um preço de 1.0520, nos cálculos temos o número (int)Comm, então precisamos adicionar / subtrair do preço = 1.0520 + (int)Comm ? Agora, para não multiplicar por Ponto - isto é feito imediatamente.

 
Youri Lazurenko:


Muito obrigado pelas características dadas, em seu próximo cargo.

A questão é que eu não tenho nenhuma parada (média) definida. E porque este erro não está presente quando inicio o terminal pela manhã e ocorre a modificação, mas apenas presente (erro) no início da sessão ao abrir uma ordem (gráficos diários) e se é um em um par. O suporte técnico respondeu que não há limitações para esta modificação, nem no tempo nem na distância (a propagação não é importante).

Vou tentar fazer algumas experiências com todas as recomendações e tirarei minhas conclusões mais tarde.

Muito obrigado, mais uma vez.

Seja bem-vindo.

Para utilizá-lo desta forma: Na função de abertura de posição, em vez da parada em pips, copie a chamada de função, na qual você coloca a parada em pips. Ou o preço de parada deve ser inserido diretamente - o compilador selecionará a função requerida. O mesmo vale para a obtenção de lucro.

Exemplo:

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, vou responder: Há um preço de 1.0520, nos cálculos temos o número (int)Comm, então precisamos adicionar / subtrair do preço = 1.0520 + (int)Comm ? Agora, para não multiplicar por Ponto - isto é feito imediatamente.


Bem, então talvez sim. É que a questão foi originalmente colocada como traduzir a comissão em pips, não em preço.
 
Artyom Trishkin:

Seja bem-vindo.

Use desta forma: Na função para abrir uma posição em vez da parada em pips, digite a chamada da função na qual você quer substituir a parada em pips. Ou o preço de parada deve ser inserido diretamente - o compilador seleciona a função requerida. O mesmo vale para a obtenção de lucro.

Exemplo:

Mais uma vez, muito obrigado. Tudo de bom.
 
Por favor, avisem Senhores: Eu desenho linhas Fibonacci com cores e níveis de estilo diferentes e sempre estabeleço o mesmo que o último, como corrigi-lo?

                  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:
Caros especialistas, por favor, aconselhem: Construo linhas Fibonacci com cores e estilos de níveis diferentes, mas sempre iguais ao último, como consertar? redesenhar e deslizar não é útil em nenhum lugar(

Níveis de fibra com este objeto, você não pode fazer diferentes estilos e cores para cada linha. Desenhe linhas separadas se você quiser um arco-íris.
Razão: