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 );
제가 사용한 코드입니다.
저도 이거 써봤는데,
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 );
이것은 전체 EA( 업데이트됨 )입니다.
//+------------------------------------------------------------------+ //| 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.
코드의 첫 번째 비트에서. . . .
OrderSelect (total+ 1 , SELECT_BY_POS, MODE_TRADES);
여기에서 존재하지 않는 주문을 선택하고 있습니다. 4개의 주문이 있는 경우 총 주문은 4가 되고 포지션 번호는 0, 1, 2 & 3이 됩니다. . . 위치 5를 선택했습니다. OrderSelect() 는 bool을 반환합니다. 이 반환 값을 확인했다면 그것이 거짓 임을 알았을 것이고 무언가 잘못되었다는 것을 알았을 것입니다.
코드의 두 번째 비트는 문제가 없는 한 괜찮아 보입니다. . . . 왜 이 줄의 시작 부분에 { 가 있습니까?
{ TP=Ask+(TakeProfit+ 20 * Point );
코드의 첫 번째 비트에서. . . .
여기에서 존재하지 않는 주문을 선택하고 있습니다. 4개의 주문이 있는 경우 총 주문은 4가 되고 포지션 번호는 0, 1, 2 & 3이 됩니다. . . 위치 5를 선택했습니다. OrderSelect() 는 bool을 반환합니다. 이 반환 값을 확인했다면 그것이 거짓 임을 알았을 것이고 무언가 잘못되었다는 것을 알았을 것입니다.
반환 값은 어떻게 확인합니까? 저널에서 그것을 찾을 수 없습니다. btw 저는 MQL의 멍청한 놈입니다. 나는 단지 내가 보는 코드를 이해하려고 노력합니다.
주문 선택에 관해서는 여러 가지 다른 번호를 시도했지만 여전히 작동하지 않으며 자체적으로 '합계'도 시도했습니다. 두 가지 주문을 선택하려면 어떻게 해야 합니까?
감사해요,
매드맥스3
- madmax3 :
반환 값은 어떻게 확인합니까?if (! OrderSelect (...)) Alert ( "OrderSelect failed: " , GetLastError ());
int total= OrdersTotal (); if (total> 1 )
이로 인해 EA는 다른 차트 및 수동 거래 를 포함하여 서로 호환되지 않습니다.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. ){ :
좋아, 나는 지금까지 이것을 가지고있다.
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 ());}
첫 번째 줄에서 다양한 번호를 시도했지만 EA는 이제 미결 주문을 수정하는 데 필요한 동안 보류 중인 주문을 수정하는 것으로 보이며 두 가지가 있는 경우에만 미결 주문을 수정합니다. 또한 계속해서 순서를 수정하는 것 같습니다.
또한 EA는 다음과 같이 작동합니다.
- 특정 시간에 먼저 두 개의 보류 주문(매도 및 매수 정지)을 배치합니다.
- 주문이 이행되지 않으면 특정 시간에 만료됩니다.
- 두 주문이 모두 열리면 두 열린 거래의 이익 실현을 수정해야 합니다.
좋아, 나는 지금까지 이것을 가지고있다.
첫 번째 줄에서 다양한 번호를 시도했지만 EA는 이제 미결 주문을 수정하는 데 필요한 동안 보류 중인 주문을 수정하는 것으로 보이며 두 가지가 있는 경우에만 미결 주문을 수정합니다. 또한 계속해서 순서를 수정하는 것 같습니다.
또한 EA는 다음과 같이 작동합니다.
- 특정 시간에 먼저 두 개의 보류 주문(매도 및 매수 정지)을 배치합니다.
- 주문이 이행되지 않으면 특정 시간에 만료됩니다.
- 두 주문이 모두 열리면 두 열린 거래의 이익실현을 수정해야 합니다.
그런 다음 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.
나는 특정 기호의 두 거래가 열려 있을 때 두 거래의 이익실현을 수정하는 코드를 작성하려고 했습니다. 본질적으로,
OrdersTotal=2인 경우
다양한 OrderSelect 기능 을 시도했지만 작동하지 않는 것 같습니다. 누구든지 이런 종류의 작업을 실행하는 데 필요한 코드를 제공할 수 있습니까?
감사해요,
매드맥스3