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.
//=============================================================================================== //------------------------------- Возвращает количество позиций --------------------------------+ //=============================================================================================== 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...
Os ciclos devem ser contados em ordem inversa, deOrderTotal()-1 a 0.
Os loops precisam contar para trás, deOrderTotal()-1 a 0.
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.
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.
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:
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);
}
Tente desta forma:
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);
}
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 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 nem sempre isso acontece, algo entre tiques? Eu não sou muito bom nisto.