int total=OrdersTotal(); if(total>1) OrderSelect(total+1, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if(OrderType()==OP_SELL) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);
Esse é o código que eu usei.
Eu também tentei usar isto,
string Symb=Symbol(); // Symbol //------------------------------------------------------------------------------- 2 -- for(int i=1; i<=OrdersTotal(); i++) // Cycle searching in orders { if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available { // Analysis of orders: int Tip=OrderType(); // Order type if(OrderSymbol()!=Symb||Tip>1)continue;// The order is not "ours" double SL=OrderStopLoss(); // SL of the selected order double TP =OrderTakeProfit(); {TP=Ask+(TakeProfit+20*Point);
Esta é a EA inteira(atualizada):
//+------------------------------------------------------------------+ //| TimeBasedEA.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ //changed by: "forex4capital@yahoo.ca" //changed again by: madmax3 // Time frame: M5 and higher extern int MagicNumber = 20080122; extern double DistancefromAsk; extern double DistancefromBid; extern double TakeProfit = 28; extern double StopLoss = 55; extern double Lots = 0.1; extern int StartHour = 2300; // Open Trade time extern bool OpenBuy = true; extern bool OpenSell = true; extern int NumBuys = 1; extern int NumSells = 1; extern int Slippage = 2; //+------------------------------------------------------------------+ //| S T A R T | //+------------------------------------------------------------------+ int start() { int cnt, ticket, total; if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); } int ct; //-------------------------------------+ if(Bars<100) { Print("bars less than 100"); return(0); } //-------------------------------------+ //-------------------------------------+ if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // check TakeProfit } //-------------------------------------+ ct = Hour() * 100 + Minute(); total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(ct == StartHour && Close[1]>Open[1] && OpenBuy) //if(ct == StartHour && High[1]<Open[0] && OpenBuy) { for ( cnt = 0; cnt < NumBuys; cnt++) { ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); } return; } // check for short position (SELL) possibility if(ct == StartHour && Close[1]<Open[1] && OpenSell) //if(ct == StartHour && Low[1]>Open[0] && OpenSell) { for ( cnt = 0; cnt < NumSells; cnt++) { ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); } return; } } for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());} return(0); } void CloseAll() { for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber()!=MagicNumber) continue; // // // // // if (OrderType()==OP_BUY || OrderType()==OP_SELL) { for(int c=0; c<3; c++) { RefreshRates(); if (OrderType()==OP_BUY) { double cp = Bid;} else { cp = Ask;} OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow); int err=GetLastError(); if(err==4 || err==136 || err==137 || err==138 || err==146) { Sleep(5000); continue; } break; } break; } } } // the end.
Em seu primeiro pedaço de código . . . .
OrderSelect(total+1, SELECT_BY_POS, MODE_TRADES);
aqui você está selecionando uma Ordem que não existe. Se você tiver 4 ordens, o total será 4, e os números das posições serão 0, 1, 2 & 3 . . . você selecionou a posição 5. OrderSelect() retorna um bool, se você tivesse verificado este valor de retorno, você teria visto que era falso e saberia então que algo estava errado.
O segundo pedaço de código parece OK, até onde vai . . . por que você tem um { no início desta linha ?
{ TP=Ask+(TakeProfit+20*Point);
Em seu primeiro pedaço de código . . . .
aqui você está selecionando uma Ordem que não existe. Se você tiver 4 ordens, o total será 4, e os números das posições serão 0, 1, 2 & 3 . . . você selecionou a posição 5. OrderSelect() retorna um bool, se você tivesse verificado este valor de retorno, você teria visto que era falso e teria sabido então que algo estava errado.
Como posso verificar o valor de retorno? Não consigo encontrá-lo no diário, btw sou um noob na MQL, apenas tento dar sentido ao código que vejo.
Quanto à ordem de seleção, eu tentei vários números diferentes, mas ainda não funciona, eu também tentei 'total' por si só. Para selecionar dois pedidos, como eu o faria?
Obrigado,
madmax3
- madmax3:
Como posso verificar o valor de retorno?if (!OrderSelect(...)) Alert("OrderSelect failed: ", GetLastError());
int total=OrdersTotal(); if(total>1)
Isso torna a EA incompatível com todas as outras, inclusive com ela mesma em outros gráficos e em trocas manuais.for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == Magic.Number // my magic number && OrderSymbol() == chart.symbol // and my pair. ){ :
Ok, eu tenho isto até agora,
for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if ( OrderSelect(iPos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == MagicNumber // my magic number && OrderSymbol() == "EURUSD" // and my pair. ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if (!OrderSelect(iPos, SELECT_BY_POS)) Alert("OrderSelect failed: ", GetLastError());}
Eu tentei vários números na primeira linha, a EA agora parece modificar as ordens pendentes enquanto eu preciso que ela modifique as ordens abertas, e só modifique as ordens abertas se houver duas delas. Além disso, ele parece modificar continuamente a ordem.
Também o EA funciona assim,
- Ele inicia dois pedidos pendentes (uma parada de venda e compra) em um momento específico
- Os pedidos expiram em um momento específico se não forem cumpridos
- Se ambas as ordens forem abertas, então o lucro de ambas as negociações abertas deve ser modificado.
Ok, eu tenho isto até agora,
Eu tentei vários números na primeira linha, a EA agora parece modificar as ordens pendentes enquanto eu preciso que ela modifique as ordens abertas, e só modifique as ordens abertas se houver duas delas. Além disso, ele parece modificar continuamente a ordem.
Também o EA funciona assim,
- Ele inicia dois pedidos pendentes (uma parada de venda e compra) em um momento específico
- Os pedidos expiram em um momento específico se não forem cumpridos
- Se ambas as ordens forem abertas, então o lucro de ambas as negociações abertas deve ser modificado.
Em seguida, selecione também OrderType()
//+------------------------------------------------------------------+ //| TimeBasedEA.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ //changed by: "forex4capital@yahoo.ca" //changed again by: madmax3 // Time frame: M5 and higher extern int MagicNumber = 20080122; extern double DistancefromAsk; extern double DistancefromBid; extern double TakeProfit = 28; extern double StopLoss = 55; extern double Lots = 0.1; extern int StartHour = 2300; // Open Trade time extern bool OpenBuy = true; extern bool OpenSell = true; extern int NumBuys = 1; extern int NumSells = 1; extern int Slippage = 2; //+------------------------------------------------------------------+ //| S T A R T | //+------------------------------------------------------------------+ int start() { int cnt, ticket, total; if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); } int ct; //-------------------------------------+ if(Bars<100) { Print("bars less than 100"); return(0); } //-------------------------------------+ //-------------------------------------+ if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // check TakeProfit } //-------------------------------------+ ct = Hour() * 100 + Minute(); total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(ct == StartHour && Close[1]>Open[1] && OpenBuy) //if(ct == StartHour && High[1]<Open[0] && OpenBuy) { for ( cnt = 0; cnt < NumBuys; cnt++) { ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); } return; } // check for short position (SELL) possibility if(ct == StartHour && Close[1]<Open[1] && OpenSell) //if(ct == StartHour && Low[1]>Open[0] && OpenSell) { for ( cnt = 0; cnt < NumSells; cnt++) { ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); } return; } for (int i =1; i < OrdersTotal(); i++) { if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); } } } return(0); } void CloseAll() { for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber()!=MagicNumber) continue; // // // // // if (OrderType()==OP_BUY || OrderType()==OP_SELL) { for(int c=0; c<3; c++) { RefreshRates(); if (OrderType()==OP_BUY) { double cp = Bid;} else { cp = Ask;} OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow); int err=GetLastError(); if(err==4 || err==136 || err==137 || err==138 || err==146) { Sleep(5000); continue; } break; } break; } } { int total=OrdersTotal(); if(total>1) OrderSelect(total+1, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue); if(OrderType()==OP_SELL) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue); } } // the end.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Tenho tentado codificar algo que modificará o lucro de dois negócios quando dois negócios de um certo símbolo estiverem abertos, essencialmente,
se EncomendasTotal=2
Eu tentei várias funções OrderSelect mas não consigo fazer com que funcione, alguém pode me fornecer o código necessário para executar este tipo de tarefa?
Obrigado,
madmax3