Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 15

 
Vitalie Postolache:
Os ciclos devem ser contados em ordem inversa, deOrderTotal()-1 a 0.
Ao fechar em um loop.
 
Vitalie Postolache:
Os loops precisam contar para trás, deOrderTotal()-1 a 0.
Estas são as funções de Kim e funcionam sem faltar, o problema é outra coisa
 
Então, acidentalmente, você ligou vários conselheiros sobre o mesmo símbolo, muitas pessoas fizeram isso.
 
Neron_76:
Olá! instalei meu robô forex na minha conta demo e ele está funcionando há um segundo mês. Estou abrindo o terminal hoje e tenho dois pedidos abertos por um sinal, embora eu tenha feito apenas um pedido antes. Eu tenho uma restrição no número de pedidos. Qual pode ser a razão?

A julgar pelo código, parece que você tem uma ordem pendente em vez de uma ordem de mercado.

A restrição do número de ordens abertas só se aplica às ordens de mercado.

É por isso que não há erro e, portanto, nenhum problema.

 
Renat Akhtyamov:

A julgar pelo código, parece que você tem uma ordem pendente em vez de uma ordem de mercado.

O limite do número de ordens abertas só se aplica às ordens de mercado.

Portanto, não há erro e, portanto, não há problema.

Esta limitação é aplicada a pedidos abertos e pendentes. Este é o segundo caso que encontrei em um mês e meio; todos os outros casos estão corretos.
 
Neron_76:
A restrição se aplica a pedidos abertos e pendentes. Esta é a segunda vez em um mês e meio, todos os outros casos são como deveriam ser.

Tente desta forma:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
 
Vitaly Muzichenko:

Tente desta forma:

if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Buy<Low[1] && sar>Close[1]) {
  SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
  return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
  SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
  return(0);
}

//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
  if(sy=="") sy=Symbol();
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
     if(OrderType()>1 && OrderType()<6) {
      if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
  return(kp);
}
Eu substituí as funções, funciona bem no teste. Vamos ver como será a comercialização na demonstração. Mas, por alguma razão, parece-me, no meu caso, que tanto estas como estas funções desempenham a mesma tarefa, ou seja, responder à pergunta se existem ordens e posições.
 
Neron_76:
As funções foram substituídas, está indo bem no teste. Vamos ver como será a comercialização na demonstração. Mas por alguma razão me parece que no meu caso ambas as funções desempenham a mesma tarefa, ou seja, respondem à pergunta se existem ordens e posições.
Se eu repetir a dupla configuração do pedido, então a função"SetOrder" deve ser reconsiderada, talvez dê dois pedidos, após o primeiro pedido não há saída da função, e tem tempo de enviar o segundo.
 
Vitaly Muzichenko:
Se a dupla configuração do pedido ocorrer novamente, então a função"SetOrder" deve ser revista, talvez dê dois pedidos, após o primeiro pedido não há saída da função, e consegue enviar o segundo.
Se este é o caso, por que isso nem sempre acontece, algo acontece entre carrapatos? Eu não sou muito bom nisto.
 
Neron_76:
Se este é o caso, por que nem sempre isso acontece, algo entre tiques? Eu não sou muito bom nisto.
Entre carrapatos de um símbolo, pode haver carrapatos de outro símbolo. Se a EA é multi-moeda, ela vê carrapatos de outro símbolo. Além disso, eventos temporizados - OnTimer() e OnChartEvent() eventos podem ocorrer entre carrapatos - quase escrevi "eventos de eventos"... seria uma armadilha...
Razão: