Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 155

 

Se uma das ordens pendentes aciona, então eu coloco outra ordem pendente na direção oposta e duplico o volume, por exemplo, se eu coloco compra, então eu coloco selltop 25 pips abaixo da compra, e se eu coloco venda, então eu coloco buyystop 25 pips acima. Se uma das ordens pendentes disparar, colocamos mais uma ordem pendente na direção oposta à ordem disparada, ao preço da primeira ordem aberta, e se ela disparar também, colocamos novamente uma ordem pendente na direção oposta à ordem disparada dentro de 25 pontos, etc. Assim, todas as ordens de compra devem ter um preço, e todas as ordens de venda também devem ter um preço. Se alguém entender o que eu escrevi aqui, por favor, ajude com o código))

int A = 0;
if (OrdersTotal()==0)
   {
   A = 0;
   if ( Close[2] < Close[1])
      {
      OrderSend (Symbol(),OP_BUY,1,Ask,3,Ask-50*Point,Ask+25*Point,0,1);                 // первый вариант событий
      OrderSend (Symbol(),OP_SELLSTOP,2,Bid-25*Point,3,Bid+25*Point,Bid-50*Point,0,2);
      A=1;
      }
      
   if ( Close[2] > Close[1])
      {
      OrderSend (Symbol(),OP_SELL,1,Bid,3,Bid+50*Point,Bid-25*Point,0,1);               //второй вариант событий
      OrderSend (Symbol(),OP_BUYSTOP,2,Ask+25*Point,3,Ask-25*Point,Ask+50*Point,0,2);
      A=2;
      }
   }
//------------------------------------------------------------------------------------------------------------------+
OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера
int price = OrderOpenPrice();
//------------------------------------------------------------------------------------------------------------------+   
int sells = 0;                                                                                                                              
for (int B = 0; B < OrdersTotal(); B++)
   {
   OrderSelect (B,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sell
   if (OrderType() == OP_SELL) sells++;
   }
   
int buys = 0;                                                                                                                        
for (int b = 0; b < OrdersTotal(); b++)
   {
   OrderSelect (b,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buy 
   if (OrderType() == OP_BUY) buys++;
   }
int sellstops = 0;                                                                                                                              
for (int C = 0; C < OrdersTotal(); C++)
   {
   OrderSelect (C,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sellstop
   if (OrderType() == OP_SELL) sellstops++;
   }

int buystops = 0;                                                                                                                        
for (int c = 0; c < OrdersTotal(); c++)
   {
   OrderSelect (c,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buystop 
   if (OrderType() == OP_BUY) buystops++;
   }
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()==1)
   {                                               //удаление отложенного ордера..
   OrderDelete(2);                                 //..который остался после срабатываения tp и sl
   }  
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()>1 && A ==1)
   {
   if (sells == buys && buystops == 0)
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price,3,price-50*Point,price+25*Point,0,2);     //условия для первого варианта
      }
   if (buys > sells && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,2,price-28*Point,3,price+22*Point,price-53*Point,0,2);
      }
   }
   
if (OrdersTotal()>1 && A ==2)
   {
   if (sells == buys && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,1,price,3,price+50*Point,price-25*Point,0,2);     //условия для второго варианта
      }
   if (buys < sells && buystops == 0) 
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price+22*Point,3,price-28*Point,price+47*Point,0,2);
      }
   }
//-----------------------------------------------------------------------------------------------------------------+
   
   return(0);
   }
 
artmedia70:
Isto é de um indicador ou de um EA? Há uma diferença. Em geral, para evitar o desenho da seta, é necessário verificar a barra anterior adjacente no indicador e se ela tem um valor não zero ou não vazio, significa que a seta na barra adjacente já existe e não há necessidade de inserir o valor no buffer da barra atual. Para uma EA, se a barra anterior adjacente já contém um fato de cruzamento na mesma direção que a atual e a seta já marca este fato, o fato de cruzamento na barra atual não pode ser registrado (se existir) e a seta também não precisa ser exibida.
Eu não posso lhe dizer mais nada sobre seu código. Se houver telepatas por perto, eles provavelmente serão capazes de entender seu código em maior escala ;)

Isto é do indicador. Intersecção de 2 deslizamentos, dá direção. Não entendo bem, a direção é dada apenas quando a travessia não é feita em todos os bares. A partir daqui, a julgar pela barra anterior é impossível.... Diga-me, estamos construindo uma matriz, não estamos? Como verificar a célula anterior? Dois amortecedores um CrossUp[i]=Low[i] - Range*0,75;, outro diz Cr[i]=Low[i] + Range*0,75;(apenas não quero entrar em pastas e codificar novamente)
 
zaqwsx123:

Se uma das ordens pendentes aciona, então eu coloco outra ordem pendente na direção oposta e duplico o volume, por exemplo, se eu coloco compra, então eu coloco selltop 25 pips abaixo da compra, e se eu coloco venda, então eu coloco buyystop 25 pips acima. Se uma das ordens pendentes disparar, colocamos mais uma ordem pendente oposta à ordem disparada, ao preço da primeira ordem aberta, e se disparar também, colocamos novamente uma ordem pendente oposta à ordem disparada dentro de 25 pontos, etc. Assim, todas as ordens de compra devem ter um preço, e todas as ordens de venda também devem ter um preço. Se alguém entender o que eu escrevi aqui, por favor me ajude com o código))

Você escreveu um monte de bobagens... Pelo menos isto:

OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера

você tem certeza de que a ordem foi escolhida? Você tem certeza de que este é o preço? Você tem certeza de que o pedido tem um bilhete == 1 ? Ao selecionar por bilhete, o pool é irrelevante, portanto o MODE_TRADES é supérfluo lá. Após a seleção bem sucedida por bilhete, devemos também verificar o horário de fechamento do pedido selecionado. Se == 0, a ordem está no mercado e foi selecionada da lista de ordens de mercado. Se o tempo de fechamento > 0, a ordem foi fechada ou é uma ordem pendente excluída e foi selecionada da lista de ordens fechadas.

Eu não quero aprofundar o código. Talvez você devesse se familiarizar com o básico primeiro. Leia o tutorial e a documentação - eles estão em um lugar de destaque aqui.

 
artmedia70:


Não quero aprofundar o código...


que me chamou a atenção)) Por que 4 pintinhos idênticos? e a amostra não é o que está no comentário

if (OrderType() == OP_BUY) buystops++   //количество ордеров buystop

O mesmo vale para selstop. você precisa de OP_BUYSTOP e OP_SELLSTOP

 
ALXIMIKS:


que me chamou a atenção)) Por que 4 pintinhos idênticos? e a amostra não é o que está no comentário

similar com selestop. você precisa de OP_BUYSTOP e OP_SELLSTOP

Eu não cheguei a esse ponto. Quando você olha para o código e vê que não tem que explicar erros, mas apenas começar a ensinar uma pessoa a partir do básico, que ele mesmo poderia ler, então ... Eu não quero. Você pode ensinar com base no pagamento, mas não onde você apenas ajuda a encontrar erros no código e não código entre erros.
 
Zolotai:

Isto é do indicador. Intersecção de 2 lâminas, dá direção. Não entendo bem, só dá direção quando não se atravessa em todos os bares. Daqui, é impossível julgar a partir do bar.... anterior Diga-me, estamos construindo uma matriz, não estamos? Como verificar a célula anterior? Existem dois buffers: um CrossUp[i]=Low[i] - Range*0,75; e outro, digamos, Cr[i]=Low[i] + Range*0,75;(Eu só não quero procurar em pastas e códigos novamente).
Não há dados de origem. Tente pesquisar aqui.
 
Há uma ordem de BUY_STOP que foi apagada antes da execução:




Código de verificação:
            for(int cnt_1=OrdersHistoryTotal()-1; cnt_1>=0; cnt_1--) {
               if(OrderSelect(cnt_1, SELECT_BY_POS, MODE_HISTORY)==true ) {
                  if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
                     Print("OrderProfit()=",OrderProfit(), "   OrderCloseTime()=",TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS), "   OrderType()=",OrderType(), "   OrderTicket()=",OrderTicket(), "   OrderClosePrice()=",OrderClosePrice(), "   OrderOpenPrice()=",OrderOpenPrice() );
                  } // if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
               }
            } // for(int cnt_1=0; cnt_1<OrdersHistoryTotal(); cnt_1++) {

Cordão com resultado:
OrderProfit()=0   OrderCloseTime()=2001.01.26 06:15:00   OrderType()=4   OrderTicket()=24   OrderClosePrice()=0.9237   OrderOpenPrice()=0.9419

1, OrderType=4 - "4" é OP_SELLLIMIT, certo?
2. OrderClosePrice()=0,9237 OrderOpenPrice()=0,9419 - De onde veio o valor OrderClosePrice() não igual a OrderOpenPrice()?

 
chief2000:

Há uma ordem de BUY_STOP que foi apagada antes da execução:




Código de verificação:

Cordão com resultado:

1, OrderType=4 - "4" é OP_SELLLIMIT, certo?
2. OrderClosePrice()=0,9237 OrderOpenPrice()=0,9419 - de onde veio o valor OrderClosePrice() não igual a OrderOpenPrice()?

no testador, em modo visualização, sobre todos os carrapatos, em modo passo a passo (F12 em pausa) encontrar o momento de sua remoção e olhar para o preço atual, talvez lá o cão esteja escondido lá?
 
artmedia70:
e você no testador em modo visualização, sim em todos os tiquetaques, em modo passo (F12 em pausa) encontra o momento de sua remoção e vê o preço atual, talvez seja onde o cão está enterrado?


BINGO! Não sabia, mas tudo como você escreveu, ou seja, o preço de fechamento neste caso é o valor do preço no momento em que o pedido foi apagado. Obrigado!
 

Muitas vezes eu declararia uma variável como esta dentro das funções:

int err = GetLastError();

Mais para dentro, em alguma condição eu já o chamo para ver se há um erro. Bem, não sou apenas eu, mas muitos outros lugares no código que encontrei. Por assim dizer, é uma situação típica. Hoje pensei que não é lógico declarar a mesma variável cada vez em cada função onde se quer controlar os erros. Pensei nisso e cheguei à conclusão de que seria mais fácil declarar globalmente uma vez e inicializá-lo no init. É assim:

// Объявили на глобальном уровне
int err;

// Инициируем данную переменную:
int init()
{
    err = GetLastError();
}

E ainda, quando você precisa chamar a variável errada nas funções do usuário, sabendo que ela já tem um valor. De fato, GetLastError() emite o código do último erro, então se esta variável errar é chamada em cada função no final de todos os cálculos, que é responsável pela emissão do código de erro, e chama GetLastError(), então tudo estará correto, certo?

Mas se você não chamar esta variável no final de alguma função (seguindo a cadeia de execução do código), ela não será reinicializada, e causará execução errada caso tenha havido um erro na execução anterior, mas não na atual, mas o código de erro é devolvido por último... E para redefini-lo, você precisa chamar esta função GetLastError(). Ou seja, aqui tudo depende se foi chamado ou não. Se você não tem certeza de que estará em todos os lugares, é mais fácil fazer um novo seguro e reinicializá-lo toda vez, certo?

Razão: