[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 742

 
artmedia70:

Eu não quero lidar com seu código (mal, mas honesto :)). Diga-me exatamente o que você quer obter no final e eu lhe escreverei a função que você precisa. Honestamente - será mais fácil para mim. Eu deveria ordenar meu próprio código... :)

... Ou vá para a cama, vá dormir e no dia seguinte todos os seus quebra-cabeças se juntarão... :) É isso que eu faço quando não entendo... A propósito, já são cinco e meia da manhã.


Após a ordem ter sido estabelecida, as variáveis que foram os critérios para a ordem devem ser novamente definidas como "0",

 
Quem sabe. Como posso obter a relação do movimento do indicador (em sua escala), por exemplo RSI, com a relação dos tiquetaques da moeda passada? Por exemplo, se o RSI passou de 0 para 50, quantos carrapatos é igual a ele?
 
Infinity:
Quem sabe. Como posso obter a relação do movimento do indicador (em sua escala), por exemplo o RSI, com a relação dos tiquetaques passados da moeda? Por exemplo, se o RSI passou de 0 para 50 - a quantos pontos será igual?

Apanhe o último valor do indicador RSI em uma vela zero. Esperamos pelo próximo tique. O tique chegou. Deixe o preço ter assinalado exatamente 1 ponto. Veja o quanto o RSI mudou. É isso aí - as chances estão em nosso bolso.
 
drknn:

Pegue o último valor do indicador RSI na vela zero. Esperamos pelo próximo tique. O tique está aqui. Vamos supor que o preço tenha marcado exatamente 1 ponto. Veja o quanto o RSI mudou. É isso mesmo - o coeficiente está em nosso bolso.

Mas então como é possível, por exemplo, que eu tenha pego o coeficiente de 1 ponto, o RSI tenha passado em sua escala de 50, acontece que passou de 50 pontos, mas na verdade foi um plano. E a vela tem 2 pontos. Então, como determinar, neste caso
 
cyclik33:

Prezado Anatoly. Muito obrigado por este código. Outra pergunta, como fazer com que funcione o tempo todo, mas fazer apenas 1 negócio por bar?

Boris, bem, é ainda mais simples do que isso. Você deixa cair esta linha:

datetime new;

No topo do código (para ser separado, não em nenhuma função).
E então, nos lugares onde há uma chamada da função OrderSend(...), basta anexá-la em um abraço adicional do se operador

if(new != Time[0]){
   new = Time[0];
   // здесь функция OrderSend(...);
}

Agora, antes de abrir outra posição, ele verificará se a barra atual contém ou não algum comércio. Se houvesse, a barra atual será armazenada na variável nova e se a barra atual for a mesma que está armazenada, o comércio não será aberto. Assim, se a barra for nova, então seu tempo de abertura não coincidirá com os dados da variável nova, o negócio será aberto e a variável nova receberá um novo valor.

Eu não conheço exatamente a arquitetura de seu consultor especializado, mas este método deve funcionar na maioria dos casos.

 
FoxUA:

Após o pedido ter sido estabelecido, as variáveis que foram os critérios para colocar o pedido devem ser novamente definidas como "0",


Eu tentei compilar seu código, ele gerou erros.
Você tem que usar variáveis que foram usadas como critério para colocar um pedido em dois métodos(start() e NewOrder1()), declará-las fora de todas as funções:

bool b,s, //соответственно бай или селл  
bs,// если закрытие по стоплоссу ордера бай
ss,// если закрытие по стоплоссу ордера sell
bt,
st;//      то же по ТП
double bl,sl; // лоты соответсвенно для бай и селл
em seguida, na etapa de loop
for(int cnt=OrdersHistoryTotal();cnt>0;cnt--)
     {
OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
{if(OrderMagicNumber()== mag &&
OrderSymbol()==Symbol()) 
{ if (OrderType() == OP_BUY )  {b=1; if (OrderClosePrice()==OrderTakeProfit()) bt=1; if (OrderClosePrice()==OrderStopLoss()) bs=1; bl=OrderLots()*10; break;}
if (OrderType() == OP_SELL)  {s=1; if (OrderClosePrice()==OrderTakeProfit()) st=1; if (OrderClosePrice()==OrderStopLoss()) ss=1; sl=OrderLots()*10; break;}
            }
         }
      }


}//end

Devem ser atribuídos os valores necessários, e depois que a ordem for aberta com sucesso na função NewOrder1(), eles devem ser zerados lá também.

int NewOrder1(int Cmd,double Lot)
{double TP=0; //тейкпрофит
double SL=0; //стоплосс
double PR=0; //Цена
double LT=0; //Лот
while(!IsTradeAllowed()) Sleep(100);
if(Cmd==OP_BUYLIMIT)
   {PR=Ask-Point*h;
    if(TakeProfit>0) TP=PR+TakeProfit*Point;
    if(StopLoss>0) SL=PR-StopLoss*Point;
    if(Lot>0) LT=3*Lot;}
int tic1=OrderSend(Symbol(),Cmd,LT,PR,3,SL,TP,0,mag,0,CLR_NONE);
//-----------
if(tic1<0){
   Print(GetLastError());
}else{
b=0;
s=0; 
bs=0;
ss=0;
bt=0;
st=0;
bl=0;
sl=0;
}
//-----------
return(0);}

Algo parecido com isto.

 
Infinity:

Quem sabe. Como obter a razão do movimento do indicador (em sua escala), por exemplo, RSI, com a razão dos carrapatos cruzados pela moeda? Para esclarecer, se a RSI passou, por exemplo, de 0 para 50 - quantos carrapatos será igual.

Uma vez tive um objetivo semelhante, por isso escrevi uma "régua" como esta, talvez ela também funcionasse para você.

//+------------------------------------------------------------------+
int get_pips_RSI_path(int home_shift, int end_shift){
   double home_index, end_index;
   double home_price, end_price;
   int path;
   
   home_index = iRSI(NULL,0,14,PRICE_CLOSE,home_shift);
   home_price = Close[home_shift];
   end_index = iRSI(NULL,0,14,PRICE_CLOSE,end_shift);
   end_price = Close[end_shift];
   
   if(end_price > home_price)path = (end_price - home_price)/Point; else path = (home_price - end_price)/Point;
   
   Alert("Между значениями RSI ", home_index, " и ", end_index, " было пройденно ", path, " пунктов.");
   return(path);
}
//+------------------------------------------------------------------+

Como parâmetros você envia turnos de barras com valores de RSI desejados, em resposta você obtém a distância entre elas em pips.

 
ToLik_SRGV:

Uma vez eu tive um objetivo semelhante e escrevi uma "régua" como esta, talvez ela funcionasse para você também.

Como parâmetros você envia os turnos de barras onde os valores de RSI desejados estão localizados, em resposta você obtém a distância entre eles em pips.


Obrigado, vou verificar hoje à noite

Tenho a forte sensação de que o teste sobre a história do Expert Advisor não dará um bom resultado devido à incompletude da história das citações. Entendo que o histórico de cotações é formado pelo arquivamento do mercado atual (cotações de castiçais), mas como você pode confiar no resultado, se as cotações reais (pelo menos no meu caso) estão voando, às vezes 40 minutos apenas sem velas, o gráfico está parado, então a vela voa para fora.

 
ToLik_SRGV:

Talvez você simplesmente não tenha encontrado uma combinação lucrativa de parâmetros, tente desmarcar a opção "Ignorar resultados inúteis".

E não se esqueça de marcar as caixas de seleção nas configurações do Expert Advisor para os parâmetros que você deseja otimizar, assim como definir os passos e os limites de otimização.

Obrigado, isso mesmo, "Ignorar resultados inúteis" é verificado.
 
artmedia70:


Meus amigos! não consigo descobrir como me livrar de sinais desnecessários que aparecem quando a linha de tendência é invertida. A linha de tendência (descendente no exemplo) é traçada do maior extremo para o menor extremo, encontrada dentro de um intervalo especificado de barras. O problema é que, assim que aparece um novo extremo mais baixo, a linha de tendência salta para esse extremo (é projetada dessa forma).

Mas, também na primeira barra, a linha de tendência constrói níveis com o valor da linha de tendência, cujo cruzamento pela linha indicadora dá um sinal. Se a linha indicadora na primeira barra estiver abaixo deste nível e na segunda barra estiver acima deste nível, então temos um crossover de cima para baixo.

Então... Quando a linha de tendência salta para um novo extremo mais baixo, surge uma situação em que a linha indicadora na segunda barra está acima da linha de tendência e abaixo do nível traçado e na primeira barra, ou seja, um sinal de venda desnecessário (neste caso):


Podemos ver na figura que a tendência mudou para um novo extremo (a localização é marcada com uma seta para baixo) e o nível de preço da nova tendência na primeira barra (linha de traço horizontal vermelha)
tornou-se inferior à linha AD na segunda barra e a linha AD na primeira barra é inferior ao nível de preço...
Assim, ao mover a linha de tendência para um extremo inferior, um sinal indesejado foi simulado. O mesmo sinal desnecessário ocorreu antes -
Marquei-o com uma linha vertical azul claro.

Daí a pergunta - como evitar esta situação? Estou exausto tentando pensar em algo...
Alguma idéia? Obrigado... :)



Entendo que um sinal comercial deve ocorrer quando a linha indicadora cruza a linha de tendência, e não vice-versa, e você o tem de ambas as maneiras. Mantenha os valores anteriores da posição da linha de tendência em variáveis estáticas e, se não tiverem mudado, verifique um cruzamento, se a linha de tendência mudou de posição - reset...