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

 

Boa tarde, senhores. )) desculpas pelo amadorismo...

Eu não entendo como funciona o OrderClose :(

Preciso de no máximo 1 pedido, ou seja, antes de abrir um novo, quero que o anterior seja fechado...

Por que não funciona dessa maneira?


OrderClose(nom, 0,01, Bid,5, Vermelho);

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


o registro está basicamente jurando sobre um bilhete inválido .

em OrderClose ao invés de nom, o que devo colocar? ou estou pensando na direção errada?)

 
Sergey Voytsekhovsky:

Tente minStopLoss = Preço atual +/- (MaxValue(2*Spread, StopLoss));

Eu tentei. Dois spreads são 24, não funcionarão dessa forma, começa a trabalhar a 19 a partir do preço de fechamento. A partir do preço de abertura atual, funciona com três spreads.
Aumentei a parada em um ponto do laço e abri uma ordem. Foi inaugurado em 19. A questão não é como defini-la. A questão é como calcular corretamente. Não há preços; eles aparecem durante a abertura manual de um pedido se você definir a parada com o botão de parada. Isto é ridículo. Estou tendo uma leitura em massa deste fórum. Encontrei algumas funções na 7ª página (mensagem #65). Informá-lo-ei quando o verificar.

 
Sergey Voytsekhovsky:

Eu o estudei, mas nada de novo, aparentemente é (novo para mim), claro, óbvio para todos os iniciados, auto-explicativo. Não consegui encontrar nada de novo, exceto a característica acima descrita de arranjo mútuo de amortecedores durante a indexação. Esta seqüência foi respeitada, ficou com uma imagem ainda mais alegre.

Fotos abaixo, arquivo anexo

Talvez você tenha muito azar, mas eu não gosto de mexer no código de outras pessoas. Ainda mais quando se trata de consertá-lo...

A próxima pergunta: com que freqüência você acha que o valor do indicador será exatamente 50?

         ColorHistogram_2Buffer1[i]=50; 

Como entendi o problema, deveria ser uma cor >50 e outra <50, mas ainda não vi ===50. É claro, para eliminar perdas no caso ===50, devemos acrescentar a uma das comparações >=50 ou a outra <=50, como a religião permite. Pode parecer melhor.

E a segunda pergunta: quantas vezes você acha que foi necessário mudar toda a indexação dos amortecedores? Depois de reindexar, você consertou tudo no código exatamente? Talvez fosse mais fácil fazer o índice de tampão de cor 4, e os tampões auxiliares 5 e 6 de acordo. Haveria menos necessidade de editar e menos chance de cometer mais alguns erros.

 
klok79:
Eu tentei. Dois spreads são 24, não funcionarão dessa forma, começa a trabalhar a 19 a partir do preço de fechamento. A partir do preço aberto atual, ele funciona com três spreads.
Aumentei a parada em um ponto do laço e abri uma ordem. Aos 19 anos, abriu. Não é uma questão de como escolher. A questão é como calculá-la corretamente. Não há preços que aparecem quando eu abro um pedido manualmente se eu colocar uma parada com o botão. Isto é ridículo. Estou tendo uma leitura em massa deste fórum. Encontrei algumas funções na 7ª página (mensagem #65). Terei que verificar e relatar.

Verificado. Obras
Tudo isso é estranho, diz o mesmo minStopLoss = Preço atual +/- (valor máximo (2*Spread, StopLoss)), só que no Preço atual entendemos não o preço aberto do pedido, mas o preço espelho.
Por que a dupla propagação é adequada?
Surgem mais duas questões.
1. Por que o SymbolInfoInteger é usado para obter Dígitos() e Ponto(); valores ?
2. Por que uma entrada (int) é utilizada antes de chamar a função SymbolInfoInteger ? Segundo entendi, esta é uma conversão do tipo forçada.

 
klok79:

Verifiquei-o. Funciona
Tudo isto é estranho, eles ainda escrevem o mesmo minStopLoss = Preço atual +/- (MaxValue(2*Spread, StopLeval)) mas o Preço atual não é o preço de abertura do pedido, mas o preço espelho.
Por que a dupla propagação é adequada?
Surgem mais duas questões.
1. Por que o SymbolInfoInteger é usado para obter Dígitos() e Ponto(); valores ?
2. Por que uma entrada (int) é utilizada antes de chamar a função SymbolInfoInteger ? Segundo entendi, esta é uma conversão do tipo forçada.

Para obter o Point() SymbolInfoInteger não funcionará de forma alguma)).

Em geral, é necessário lembrar que o Ponto() ou _Ponto é somente para o símbolo atual. Para outros caracteres além daquele em que a EA trabalha, você deve usar esta mesma função.

A função SymbolInfoInteger retorna não apenas valores int, mas também valores longos, bool e enumerações.

 

Sergey Voytsekhovsky, obrigado por sua ajuda. E mais uma pergunta, se você não se importa, sugira a função inversa à funçãoCharToStr
(para obter seu código a partir de um símbolo), porque eu tenho funções para ele em Beisic e Delphi, mas em C++, até onde eu sei, há dois métodos:
1 - FunçãoAscii_cod, que não está em mql4
2. - Conversão direta do tipo. Mas meu código é
string st="A";
Imprimir ("Character code A=",(int)st);

Texto de saída Código de caracteres A=0.

O que fazer?

 
klok79:

Sergey Voytsekhovsky, obrigado por sua ajuda. E mais uma pergunta, se você não se importa, poderia sugerir a função inversa da funçãoCharToStr
(para obter seu código a partir de um símbolo), já que eu usei Beisic e Delphi, eles têm funções para ele, enquanto em C++, como eu o entendo, têm dois métodos:
1 - FunçãoAscii_cod, que não está em mql4
2. - Conversão direta do tipo. Mas meu código é
string st="A";
Imprimir ("Character code A=",(int)st);

Texto de saída Código de caracteres A=0.

O que fazer?

StringToCharArray, ao contrário da função wiki, não converte apenas um caractere de cada vez, mas pode converter uma string para um conjunto de tipos de ucar com códigos de todos os caracteres da string.

O mql4 também tem essa função.

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

Para obter o Point() SymbolInfoInteger não funcionará de forma alguma)).

Em geral, é necessário lembrar que o Ponto() ou _Ponto é somente para o símbolo atual. Para outros caracteres além daquele em que a EA trabalha, você deve usar esta função.

A função SymbolInfoInteger retorna não apenas valores int, mas também valores longos, bool e enumerações.

Na verdade, a Point tem o dobro do valor. Isso significa que devemos chamá-lo de SymbolInfoDouble

 
Konstantin Nikitin:

Bem, na verdade, Point tem um valor duplo. Isso significa que o pedido deve ser feito por SymbolInfoDouble

Trata-se destas funções para a MQL4 a partir do posto nº 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);
   }
//+------------------------------------------------------------------+

Eu não vi onde o Ponto é obtido via SymbolInfoInteger()

 
Artyom Trishkin:

Trata-se das funções da MQL4 do posto #65:

Eu não vi onde o Ponto é obtido via SymbolInfoInteger()

Sim, o mesmo. Escorregamos por ela. O principal é que ele entende o que é o que...