Estou aprendendo a escrever um conselheiro... - página 5

 


Como usar a função RefreshRates() corretamente ?

 int ticket;
   while(true)
     {
      ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"комментарий эксперта",255,0,CLR_NONE);
      if( ticket<=0)
        {
         ......
         RefreshRates();
        }
      else
        {
         .....
        }
     }

Leia também no fórum "ERROR: code=138 - requote".

Eu tenho "OrderSend error 138" gerado no testador várias vezes por segundo... é um requote? Em caso afirmativo, como lutar com isso)?

 

Depois de ler 20 tópicos sobre solicitações... Eu finalmente descobri qual foi o meu erro)

Tive uma "pseudo" solicitação. O motivo foi a condição de entrada que foi desencadeada e, portanto, o preço foi enviado para . Na realidade, o preço real era menor ou maior do que o anunciado em . Toda vez que a OrderSend tentava abrir uma ordem, ela dava um erro 138, é claro.

A solução era verificar antes de OrderSend se o preço real era igual ao preço passado pelo sinal)

RefreshRates();
      if (Bid == ( цена переданная сигналом на продажу))
         OrderSend (....); //продажа

O que falta fazer é verificar se há erros na OrderModify, pois isso pode levar a conseqüências ruins - sem parar!

Acho que não precisamos verificar o OrderSend, deixe-o bater seu pulso pelo preço dado pelo sinal) Se as solicitações vierem, não importará - eu terei tempo para comprar ou vender. O principal é que tudo funciona como planejado)

 
ALex2008 писал(а) >>

Depois de ler 20 tópicos sobre solicitações... Eu finalmente descobri qual foi o meu erro)

Tive uma "pseudo" solicitação. O motivo foi a condição de entrada que foi acionada e, portanto, o preço foi passado para a OrderSend. E na realidade, o preço real era menor ou maior do que o que eu havia entrado na OrderSend. Toda vez que a OrderSend tentou abrir uma ordem, ela deu erro 138.

A solução era verificar antes de OrderSend o preço real, se este era igual ao preço passado pelo sinal).

Resta apenas verificar se há erros na OrderModify, pois isso pode levar a conseqüências ruins - sem parar!

Acho que não há necessidade de verificar o OrderSend, deixe-o bater seu pulso ao preço que o sinal define) Se as solicitações vierem, não importará - eu terei tempo para comprar ou vender. O principal é que tudo funciona como planejado)

RefreshRates();
útil para fazer antes de acessar o Ask Bid

Se você quiser verificar todos os valores limite de Venda ou Compra antes do bloco que calcula o stop take e o preço de entrada - pedidos pendentes de longo prazo podem não ser afetados se não forem calculados com base no preço atual

 
YuraZ >> :

RefreshRates();
é útil fazer isso antes de acessar o Ask Bid

Não era isso que eu fazia... antes da Licitação

if (Bid == (цена переданная сигналом на продажу))

antes do bloco que calcula o preço de stop take e entrada - os pedidos de longa distância podem não ser afetados se não forem calculados ao preço atual

Explique-me... Então, no meu caso, não é necessário aqui, porque não conta, mas compara... Estou lendo isto bem?
 
ALex2008 писал(а) >>

Não foi isso que eu fiz... antes de me voltar para Bid


>> Explique por favor. Então, no meu caso não é necessário aqui, porque não está contando, está comparando? Estou lendo isto bem?

Você fez a coisa certa :-)

Não é um problema aí!

É só que o bloco onde você acessa os preços deve estar de preferência em um só lugar

é preferível ter este comando antes de aplicar

Você se dirige ao Bid Ask e depois de calcular todas as paradas você tem que entrar no mercado sem muito atraso.

---

acrescente isto ao código

em termos simplificados

1 - Sinal recebido - bandeira definida para execução.

2refresh() calcular as paradas de take-away

3-em

4-servidor rejeitado

Erro de código de 5 decodificação

6-sinal ainda está ativo - conjunto de bandeiras de execução?

7- ir para o ponto 1

e é necessário quebrar este ciclo

porque pode se tornar bastante longo

mas temos que

1-deciso sobre o erro

2 - tente bater no revendedor não enquanto o ciclo exigir

2.1 por exemplo, você poderia fazer uma contagem de quantas vezes você bateu

2.2 você pode fazer um quantum de tempo

2.3 DEVE manter um registro se você tem um sinal antes de emitir comandos para execução!

ou você pode querer cancelá-lo!

 
YuraZ >> :

...é só que você deve ter o bloco onde você acessa os preços de preferência em um só lugar

e é preferível ter este comando antes de ligar

você vai ao Bid Ask e calcula todas as paradas para entrar no mercado sem nenhum atraso.

Em um só lugar... Eu não entendo bem... Estou fazendo um indicador há muito tempo, mas não consigo completar o laço).

Tenho-o assim:

-O preço para entrar é definido pelas funções UpTrend() e DownTrend() que verificam o sinal

-verificar (se) a paridade do preço com o preço do sinal

-O preço para entrar e os preços são processados por OrderSend

-o preço de parada é processado na função ModifyPos() que segue OrderSend


1- Sinal recebido - conjunto de bandeiras para execução // a função de verificação do sinal passa pela função de configuração do pedido
2-refresco() calcular decolagens //cheque a consistência com o preço - preço do sinal (se ele ainda estiver ativo)
3 entradas //cálculo das decolagens é estático na função OrderSend, pára na função OrderModify
4-servidor rejeitado // se o pedido não for feito e houver um sinal, então entre novamente ao preço do sinal (se ele ainda for válido)
5 decodifique o erro // você precisa dele para si mesmo, caso haja um novo problema
6-sinal ainda está ativo - bandeira para executar ? //condição de correspondência de preço - preço do sinal (se ainda for válido).
7-go to step 1 //to step 3

e temos que quebrar este ciclo.
pode tornar-se bastante longo //as desde que o preço== o preço do sinal, acho que não, mas pode ser freqüente)
mas temos que

1-determinar o erro //I acho que vou trabalhar nisso hoje.
2- tentar bater no revendedor não tanto quanto deveria ser //o preço==o preço do sinal
2.1 por exemplo, você pode fazer um contador para quantas vezes você precisa se alongar // tem que pensar sobre isso, verifique seu histórico no testador
2.2 você pode fazer isso em um quantum de tempo // pode perder o preço== o preço do sinal (se ele ainda estiver ativo)
2.3 Você DEVE verificar se existe um sinal antes de dar ordens para executar cada série!
pode ser o momento de cancelar o sinal // a função de verificação do sinal passa a função de definição do pedido


 

Agora eu não entendo como implementar corretamente a OrderModify ? Sem ele não posso estabelecer um limite de DC ao abrir...

- pode obter um erro de 130 se o preço mudar após a abertura e ele se aproximar

-é possível obter um erro de reembolso 138 e o preço será mais alto e então a parada não será definida de forma alguma

-é possível obter um reembolso de 138 e o preço será mais baixo, o que não é crítico, pois a parada será definida mais tarde.

Então...

сигнал действует

RefreshRates
();
if (Bid == ( цена сигнала))
{
OrderSend(Symbol(), OP_SELL, Lot, ( Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);
}

As desvantagens desta variante são

-Se o preço se mover abaixo do preço aberto, a parada nunca será definida

Se o preço for abaixo do preço aberto, a parada nunca será colocada - ela sempre tentará modificar o pedido. Ou não vai?


mais ou menos...


сигнал действует

RefreshRates
();
if (Bid == ( цена сигнала))
OrderSend(Symbol(), OP_SELL, Lot, ( Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);

Desvantagens desta variante

-Existirão muitos erros se o preço se mover contra


 

Por enquanto estou considerando esta opção na parada, coloque-a até que ela seja configurada)

void ModifyPos()
   {
        if (OrderSelect(0, SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid- Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                        if ( ModifyB == false)
                           for (int i=0; ModifyB==true; i++)
                              {
                                 SLB = SLB+ i*Point;
                                 RefreshRates();
                                 ModifyB;
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+ Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                        if ( ModifyS == false)
                           for (int j=0; ModifyS==true; j++)
                              {
                                 SLS = SLS+ j*Point;
                                 RefreshRates();
                                 ModifyS;
                              }                                                   
            }      
   }

Mas há erros nas linhas com ModifyB; ModifyB;

- variável já definida

- variável já definida




 

Outra opção, mas também com erros (

void ModifyPos()
   {
        if (OrderSelect(0, SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid- Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                        if ( ModifyB == false)
                           for (int i=0 ;; i++)
                              {
                                 SLB = SLB+ i*Point;
                                 RefreshRates();
                                 bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                                    if ( ModifyB==true)
                                       continue; 
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+ Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                        if ( ModifyS == false)
                           for (int j=0 ;; j++)
                              {
                                 SLS = SLS+ j*Point;
                                 RefreshRates();
                                 bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                                    if ( ModifyS==true)
                                       continue; 
                              }                                                   
            }      
   }
 
ALex2008 писал(а) >>

Outra opção, mas também com erros (

ticket=OrderSend( symb, bs, lot, op, slippage,0,0, comm, magic);
      if( ticket==-1) {
Print("Не получилось открыть ордер, ошибка ",GetLastError());
      }
      if( ticket>0) {
         OrderSelect( ticket, SELECT_BY_TICKET);
         if(OrderType()==OP_BUY) {
            sl= расчет стопа;
            tp= расчет тейка;
         }
         if(OrderType()==OP_SELL) {
            sl= расчет стопа;
            tp= расчет тейка;
         }
         ... Проверка стопов на стоплевел
            if(!OrderModify( ticket, OrderOpenPrice(), sl, tp, 0, CLR_NONE)) {
               Print("Не получилось модифицировать ордер, ошибка ",GetLastError());
           }
Tente desta forma.
Razão: