[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 768

 
FoxUA:


Só preciso chamar a função, só preciso de uma linha: "Se houver mais pedidos do que um .... e isso é tudo" - e você está me oferecendo uma função completa

Eis como eu guardo meus dados de pedido


É simples, ponha-o na biblioteca.

O tipo de uma ordem a ser contada e seu mestre é dado como entrada, ele retorna o número de ordens abertas ou definidas.

int ChPos( int TypePos,int Magic) 
{
// возвращает кол-во позицй которые открыты или выставленн отложками с магиком  Magic 
   int i;
   int count=0 ;
   for( i=0; i < OrdersTotal(); i++)         
   {
      if(OrderSelect(i,SELECT_BY_POS)==true) 
       {                                   
           if(OrderType()==OP_BUY && TypePos==OP_BUY && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELL && TypePos==OP_SELL && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_BUYLIMIT && TypePos==OP_BUYLIMIT && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_BUYSTOP && TypePos==OP_BUYSTOP && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELLLIMIT && TypePos==OP_SELLLIMIT && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELLSTOP && TypePos==OP_SELLSTOP && Magic==OrderMagicNumber()){count++;}
       }
    }   
return(count);
}

Você pode utilizá-lo da seguinte maneira

if ((FastEma - SmallEma) > Compartor*Point && ChPos(OP_BUY,1111) < OpenPosition)

 
ivandurak:


Não é complicado colocá-lo na biblioteca.

A entrada é o tipo de ordem a ser contada e seu mestre, ele retorna o número de ordens abertas ou definidas.

Isto pode ser usado da seguinte maneira

if ((FastEma - SmallEma) > Compartor*Point && ChPos(OP_BUY,1111) < OpenPosition)

Eu tenho essa função e não preciso dela, só preciso
apenas uma linha "se houver mais pedidos do que um .... então" e é isso

meus dados para a mesma função que você mostrou estão armazenados aqui

int total_order;            // переменная в которой хранится общее количество открытых ордеров в терминале
int my_total_order;         // переменная в которой хранится общее количество открытых ордеров с нашим Magic

e aqui está o que parece

void Myorders(){
      int cnt;
      total_order = OrdersTotal();
      my_total_order = 0;
      HaveBuyOrder          = false;
      HaveSellOrder         = false;
      HaveBuyStopOrder      = false;
      HaveSellStopOrder     = false;
      HaveBuyLimitOrder     = false;
      HaveSellLimitOrder    = false;
      HaveBuyLimitOrderEnd  = false;
      HaveSellLimitOrderEnd = false;      
      for(cnt = total_order - 1; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Curr_symb && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY)       {HaveBuyOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELL)      {HaveSellOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYSTOP)   {HaveBuyStopOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLSTOP)  {HaveSellStopOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrderEnd = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrderEnd = true; my_total_order++;}
} } }
 

Acho que consegui.

static int aaa = OrdersHistoryTotal()+ OrdersTotal()

se (sua condição && aaaa < OrderHistoryTotal()+ OrderTotal() )

{

operadores

aaa=OrdensHistóriaTotal()+ OrdensTotal()

}

Se assim for, é ainda melhor colocá-lo em uma função com os mágicos em mente. Você pode nos dizer em que está trabalhando? A lógica é um pouco estranha se eu acertar, quando mais um pedido é aberto, não é mais fácil abrir pedidos não maiores que OpenPosition?

Sua função retorna o número total de ordens abertas e ordens pendentes. Quantas ordens OP_BUY, se houver OP_BUYLIMIT OP_SELLLLIMIT OP_SELLL etc. não aparece.

 
ivandurak:

Já descobri, agora o problema com a função if é que não consigo descobrir qual é o problema.

if(bt==1&&bl==7) 
{OpenBuyStopOrder(Lot,PRBidS);
OpenBuyLimitOrder(Lot*3,PRAskL); 
  if (HaveBuyLimitOrderEnd== true) 
  {ModifyBuyStopOrder(PRAskS);  // Выбираем            
  } }          
  

a questão é que o primeiro valor é executado.

Este não funciona se (HaveBuyLimitOrderEnd== verdadeiro)
{ModifyBuyStopOrder(PRAskS); // Selecione
} }

em palavras, se houver um pedido HaveBuyLimitOrderEnd, modifique-o com uma mudança de preço PRAskS

Não consigo descobrir o que está errado. Tomo o valor HaveBuyLimitOrderEnd de void Myorders() no código acima

o valor if(bt===1&&bl====7) é principal, portanto, se for verdade, use todos os seguintes


o mais provável é terBuyLimitOrderEnd== verdadeiro porque eu defini OrderLots()==3*Lot all work apenas modifica os pedidos com 0,3 lote

 
void Myorders(){
      int cnt;
      total_order = OrdersTotal();
      my_total_order = 0;
      HaveBuyOrder          = false;
      HaveSellOrder         = false;
      HaveBuyStopOrder      = false;
      HaveSellStopOrder     = false;
      HaveBuyLimitOrder     = false;
      HaveSellLimitOrder    = false;
      HaveBuyLimitOrderEnd  = false;
      HaveSellLimitOrderEnd = false;      
      for(cnt = total_order - 1; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Curr_symb && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY)       {HaveBuyOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELL)      {HaveSellOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYSTOP)   {HaveBuyStopOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLSTOP)  {HaveSellStopOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrderEnd = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrderEnd = true; my_total_order++;}
} } }
Por favor, note que está destacado em vermelho . O tipo de ordens comerciais é o mesmo e as variáveis no tubo são definidas de forma diferente, é assim que deve ser.
 
ivandurak:
Observe o que está destacado em vermelho . O tipo de ordens comerciais é o mesmo e as variáveis no tubo são diferentes, é assim que deve ser.

Sim, deve ser, porque há diferentes funções de abertura e eu não faço um pedido de OrderType () e pedi a bandeira se ela está aberta, mas o problema não está nesta função porque os outros pedidos também não funcionam esta que eu lancei pela primeira vez, E NA MESMA FUNÇÃO ABERTA NORMALMENTE

ENTÃO O PROBLEMA É COM O PEDIDO NO OPERADOR

 

O problema parece estar em outro lugar. Mas você provavelmente deveria ver o código.

 
Vinin:

O problema parece estar em outro lugar. Mas eu acho que preciso ver o código.


Definitivamente não está em outro lugar, tudo o resto funciona, mas o problema é que o pedido (HaveBuyLimitOrderEnd=== verdadeiro) está errado, então estou me perguntando como dizer para modificar e excluir,

ou a própria consulta está errada

if(bs===1&&bl====3)
{OpenBuyLimitOrderEnd(Lot*15,PRAskL);

se (HaveBuyLimitOrderEnd== verdadeiro)

{ModifyBuyStopOrder(PRAskS);
} }

 
FoxUA:

Sim, deve ser, porque existem diferentes funções de abertura e eu não faço um pedido de OrderType () e pedi a bandeira se ela está aberta, mas o problema provavelmente não está nesta função porque os outros pedidos também não funcionam esta que eu lancei pela primeira vez, E NA MESMA FUNÇÃO ABERTA NORMALMENTE

ENTÃO O PROBLEMA É COM A CONSULTA NO OPERADOR

if(bt==1&&bl==7) 
{OpenBuyStopOrder(Lot,PRBidS);
OpenBuyLimitOrder(Lot*3,PRAskL); 
  if (HaveBuyLimitOrderEnd== true) 
  {ModifyBuyStopOrder(PRAskS);  // Выбираем            
  } }         


Será que em funções marcadas em vermelho HaveBuyLimitOrderEnd está definido no tubo? Caso contrário, você precisa ligar para Myorders() antes de if. Caso contrário, você não sabe o que existe. E, só por precaução, as bandeiras (variáveis)

HaveBuyOrder = falso;
HaveSellOrder = falso;
HaveBuyStopOrder = falso;
HaveSellStopOrder = falso;
HaveBuyLimitOrder = falso;
HaveSellLimitOrder = falso;
HaveBuyLimitOrderEnd = falso;
HaveSellLimitOrderEnd = falso;
deve ser definido a nível global .

 
ivandurak:


Pergunto-me se a bandeira HaveBuyLimitOrderEnd está colocada em vermelho no cano. Caso contrário, você precisa chamar Myorders() antes de if. Caso contrário, você não sabe o que existe. E só por precaução, bandeiras (variáveis)

HaveBuyOrder = falso;
HaveSellOrder = falso;
HaveBuyStopOrder = falso;
HaveSellStopOrder = falso;
HaveBuyLimitOrder = falso;
HaveSellLimitOrder = falso;
HaveBuyLimitOrderEnd = falso;
HaveSellLimitOrderEnd = falso;
deve ser definido globalmente.

está a um nível glabal


bool HaveBuyOrder; // bandeira se houver ordens de compra no mercado aberto
bool HaveSellOrder; // bandeira de ordens de mercado aberto para vender
bool HaveBuyStopOrder; // bandeira de ordens de compra em aberto pendentes
bool HaveSellStopOrder; // bandeira de ordens pendentes de venda
bool HaveBuyLimitOrder; // bandeira de ordens de compra em aberto pendentes
bool HaveSellLimitOrder; // bandeira de ordens pendentes Sell
bool HaveBuyLimitOrderEnd; // bandeira de presença de ordens de compra em aberto pendentes
bool HaveSellLimitOrderEnd; // bandeira pendente Ordens de venda abertas

está na função de abertura da ordem.

bilhete = OrderSend(Curr_symb,OP_BUYSTOP, Lot, PRAskS, Slippage, SL, TP, 0, Magic, 0, CLR_NONE);
se (bilhete > 0) {
HaveBuyStopOrder = verdadeiro;

se (OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES)) Imprimir("função para colocar um pedido BuyStop : ", OrderOpenPrice())
}
else Print("Error # ", GetLastError(), " function for placing BuyStop order",MarketInfo(Curr_symb,MODE_ASK));
retorno(bilhete);
}

ENTÃO TUDO O RESTO FUNCIONA