Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 574

 
Anton Balakirew:
A ideia de abrir encomendas num sinal de compra ou de aderência, como fazer para que haja apenas uma transacção de compra/venda e uma transacção de encomenda pendente, eu tenho uma aberta em cada tic da transacção. Ajudar a resolver o problema.
Verifique o número de ordens definidas e o número de posições em aberto antes de abrir uma nova posição ou colocar uma nova ordem pendente.
 
Artyom Trishkin:

Bem, aqui está outra forma de o fazer: são escritos fósforos para cada vela da gama. Na versão anterior, os fósforos foram escritos apenas para uma vela - ou seja, não foi escrito nenhum fósforo para aquele que correspondia a esta.

Artem, obrigado. Vou estudar o assunto.

pako:

Os valores altos podem ser arredondados, por exemplo, podemos arredondar o valor 1,23456 para 1,2346.


Estou a ver o que quero dizer. Também adiciono uma variável nas definições em que se pode prescrever o desvio dentro do qual os valores de alta são considerados iguais. É necessário porque para citações de 4 dígitos muitas vezes não existe tal problema, mas para citações de cinco dígitos para procurar correspondências exactas é infinitamente possível.

 
Andrey Koldorkin:

Artem, obrigado. Vou analisar a questão.

O arredondamento é claro. Coloco também uma variável nas definições, na qual poderei prescrever o valor do desvio, dentro do qual os Altos valores são considerados iguais. É necessário, porque para citações de 4 dígitos muitas vezes não existe tal problema, mas para citações de cinco dígitos à procura de correspondências exactas é interminável.

De nada. Fiz uma imprecisão na segunda versão. Uma vez que na primeira versão estávamos a procurar as partidas a partir da vela seguinte do índice do laço, a passagem do laço principal era pelo número de velas menos uma para comparar as duas velas mais exteriores. Agora, na segunda versão, para cada um dos castiçais procuramos fósforos em toda a gama, por isso, na linha

for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"

deve alterar o número de barras para

for(int i=0; i<copy_bars; i++) {                             // цикл по скопированным данным от начала до конца диапазона
 
Artyom Trishkin:
Verifique o número de ordens definidas e o número de posições em aberto antes de abrir uma nova posição ou colocar uma nova ordem pendente.

ou seja, é necessário acrescentar uma condição para verificar o número de ordens e posições nas condições para uma transacção?

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&h2>h1&h1<o2&o1<c1&&l2>l1&&o3>c3&&o4>c4){ //first condition

se (OrderTotal()==0) //segundo estado

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0); } ................................... e assim para cada comércio?

E que função conta o número de posições em aberto?

Penso ter resolvido o problema:

se (Hora()>=0&Hora()<23){

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

se (PositionsTotal()<=1)

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0); } //abre a compra

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

se (PositionsTotal()==1&OrderType()==0)

OrderSend(Symbol(), OP_SELLSTOP,Lot,l2,10,h2,0);} //Postponed SellStop encomenda

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

se (PositionsTotal()<=1)

OrderSend(Symbol(),OP_SELL,Lot,o,10,h1,0); } //abre Sell

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

se (PositionsTotal()==1&OrderType()==1)

OrderSend(Symbol(), OP_BUYSTOP,Lot,h2,10,l2,0);} //Pós-encomenda de BuyStop

}

//+------------------------------------------------------------------+

//Função que devolve o montante total de posições em aberto |

// |

//+------------------------------------------------------------------+

int PosiçõesTotal() {

int pos = 0;

para (int i=0; i<OrdersTotal(); i++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

se (OrderType() == OP_BUY || OrderType() == OP_SELL)

pos++;

}

devolução(pos);

}

//+------------------------------------------------------------------+

 
Artyom Trishkin:

Bem, aqui está outra forma de o fazer: são escritos fósforos para cada vela da gama. Na versão anterior, os fósforos foram escritos apenas para uma vela - ou seja, não foi escrito nenhum fósforo para aquele que correspondia a esta.

Bom. Mas, a meu ver, se o alto da vela 2 coincide com o baixo da vela 7, então serão encontrados dois pares: 2 <=> 7, 7 <=>2. E que tal contabilizar os pares inversos, mas sem o laço extra?

Não se pode resolver o problema numa só passagem, sem utilizar laços aninhados:))))?

 
Vasiliy Sokolov:

Gud. No entanto, segundo sei, se o alto da vela 2 coincidir com o alto da vela 7, serão encontrados dois pares: 2 <=> 7, 7 <=>2. E a contabilização de pares inversos, mas sem o laço extra?

Que tal resolver o problema de uma só vez, sem utilizar laços aninhados:))))?

:) Não tente fazer de mimfraco;) Claro, penso que se pode resolver o problema com um laço, mas eu era demasiado preguiçoso para pensar muito mais tempo e fiz o que pensei ao mesmo tempo.

Naturalmente, aqui todas as velas emparelhadas ou mais são registadas nos dados de fósforo de cada vela. É por isso que eles se cruzam. Estou apenas a sugerir variantes, sem saber para que servem.

E ainda é possível resolver a tarefa de optimização dos cálculos, mas não preciso dela.

E se precisar exactamente dos dados para cada vela e todos os fósforos, e se, de repente, de repente ... existe apenas ....

Por isso, não tenho tempo nem desejo. Perdi o meu tempo em vez de escrever os meus próprios códigos.

SZY, talvez devesse também ligar os métodos Kohonen conhecendo o parâmetro de entrada necessário.

 
Artyom Trishkin:

Em geral - sem tempo e sem desejo. E assim perdi tempo em vez de escrever os meus próprios códigos.

É uma pena, uma verdadeira pena.
 
Vasiliy Sokolov:
Que pena, que pena.
Bem, sim, é uma tarefa interessante, mas, infelizmente, não tenho tempo.
 
Artyom Trishkin:

De nada. Fiz uma imprecisão na segunda versão. Uma vez que a primeira versão procurou fósforos a partir da vela seguinte do índice do laço, o laço principal foi passado pelo número de velas menos uma para comparar as duas velas mais exteriores. Agora, na segunda versão, para cada um dos castiçais procuramos fósforos em toda a gama, por isso, na linha

deve alterar o número de barras para

Por favor, diga-nos o significado destas linhas:

input int Search_Period=10; // Número de candelabros a copiar

int searchPeriod=(Search_Period<1)?1:Search_Period; // o que significam os símbolos "?", ":"?

input int Delta=2; // Número de pontos de admissão

int delta=(Delta<0)?0:Delta; // o que é que os símbolos "?", ":" significam?

 
Andrey Koldorkin:

Por favor, digam-me o significado destas linhas:

input Search_Period=10; // Número de castiçais a copiar

int searchPeriod=(Search_Period<1)?1:Search_Period; // o que é que os caracteres "?", ":" significam?

input int Delta=2; // Número de pontos de admissão

int delta=(Delta<0)?0:Delta; // o que é que os símbolos "?", ":" significam?

// строку int searchPeriod=(Search_Period<1)?1:Search_Period;
// можно расписать так:

input int Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройках
int searchPeriod;           // Сюда будем записывать входной параметр
if(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен единице
else searchPeriod=Search_Period;    // иначе примем входной параметр

// соответственно и строку int delta=(Delta<0)?0:Delta;
// можно расписать точно так же

A partir de referência:

Operador condicional ?

A forma geral de um operador ternário tem este aspecto:

expressão1? expressão2: expressão3

Como primeiro operando, "expressão1" pode ser qualquer expressão que resulte num valor de tipo bool. Se o resultado for verdadeiro, o operador especificado pelo segundo operando, "expressão2", é executado .

Se o primeiro operando forfalso, o terceiro operando, "expressionZ", é executado. O segundo e terceiro operandos, ou seja, "expressão2" e "expressãoZ", devem retornar valores do mesmo tipo e não devem ser de tipo nulo. O resultado da execução do operador condicional é o resultado da "expressão2" ou o resultado da "expressão3", dependendo do resultado da "expressão1".

//--- renormalizar a diferença entre os preços de abertura e fecho pelo intervalo diário

duplo verdadeiro_intervalo = (Alto==Baixo)?0:(Fechado-Aberto)/(Alto-Baixo);

Esta entrada é equivalente ao seguinte

duplo_amplitude;

if(High===Low)true_range=0;// se High e Low são iguais

else true_range=(Close-Open)/(HighLow);// se High is non-zero