지정된 기간 및/또는 SL 후 자동으로 주문 마감 - 페이지 3

 

이것은 매우 잘못된 것입니다. . .

 OrderSelect (BuyTicket || SellTicket, SELECT_BY_TICKET);

(BuyTicket || SellTicket) 결과는 true 또는 false 입니다. . . 이 경우 true 또는 false는 1 또는 0으로 간주됩니다. . . SellTicket 또는 Buyticket 번호가 아닙니다. . .

손절매 = 40 . . . . OrderSend에서 손절매를 사용할 때 그것은 가격입니다. . . 핍의 숫자가 아니라 슬리피지는 핍의 숫자입니다. . . 문서 읽기: OrderSend

손절매 - 손실 수준을 중지합니다.
이익을 취하다 - 이익 수준을 취하십시오.
 

알겠습니다. 무슨 말인지 알겠어요. 그래서 OrderSelect를 사용 하는 동안 주문을 선택하는 명령이 필요합니다...또는 이 경우 OrderSelect가 일반적으로 잘못된 것입니까?

 

문서를 읽으십시오. . . OrderSelect 는 OrderLots, OrderTicket, OrderOpenPrice 등을 사용하기 전에 주문을 선택하는 데 필요합니다. " 참고: 주문은 OrderSelect() 함수에 의해 미리 선택되어 있어야 합니다. "

기존 주문과 관련된 정보를 사용할 필요가 없다면 OrderSelect가 필요하지 않습니다. 당신이 할 경우 . . . 그럼 당신은 할.

 
RaptorUK :

문서를 읽으십시오. . . OrderSelect 는 OrderLots, OrderTicket, OrderOpenPrice 등을 사용하기 전에 주문을 선택하는 데 필요합니다. " 참고: 주문은 OrderSelect() 함수에 의해 미리 선택되어 있어야 합니다. "

기존 주문과 관련된 정보를 사용할 필요가 없다면 OrderSelect가 필요하지 않습니다. 당신이 할 경우 . . . 그럼 당신은 할.


현재 시장에 포지션이 있으면 폐쇄하고 다른 포지션으로 대체해야 하기 때문에 이 정보가 필요하다고 생각합니다. 나는 OrderSelect가 이런 식으로 나를 도울 것이라고 생각했습니다. 그러나 Orderselect가 시장에서 활성 포지션이 아닌 미결 주문을 위한 것이라면 유용하지 않습니다. 내 말이 맞아?

그러나 OrderSelect가 도움이 되지 않는다면 어떻게 활성 포지션을 청산할 수 있습니까?

문안 인사

마크

 
보류 중인 주문을 사용하지 않고 미결 주문 이 있는 경우 구매 또는 판매 중 하나가 됩니다. . . 시장 주문.
 
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber =1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=40;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
       if((OrderOpenTime()+3600) < TimeCurrent())
          { 
           if (OrderType() == OP_BUY)          
              {
               bool Closed = OrderClose(OrderTicket() ,OrderLots(), Ask, UseSlippage, Red);           
               openbuy = 0;
              }
           if (OrderType() == OP_SELL)          
              {
               Closed = OrderClose(OrderTicket() ,OrderLots(), Bid, UseSlippage, Red);  
               opensell = 0;         
              }              
          }
       }
    }


//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue);
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
} 

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

This seems to be mostly correct, but now I need to know why the prog only executes the sell order @ 12 & 23...and not the buy orders...?
 

nirvanamac :

이것은 대부분 맞는 것 같지만 이제 prog가 12 및 23에서 판매 주문만 실행하고 구매 주문은 실행하지 않는 이유를 알아야 합니다...?

아마 그럴 것이다. . 트래핑하지 않는 오류가 발생할 수 있습니다. . .

노력하다 . . .

 //BuyOrder 
if ((TradeHour3== Hour ())||(TradeHour4== Hour ())||(TradeHour7== Hour ())||(TradeHour10== Hour ())||(TradeHour17== Hour ())||(TradeHour18== Hour ())||(TradeHour20== Hour ()) && openbuy == 0 ) //Signal Buy
{
  openbuy= OrderSend ( Symbol (),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point , 0 , "time trader buy order " ,MagicNumber, 0 , Blue ); 
   if (openbuy < 0 ) Print ( "OrderSend OP_BUY failed, error: " , GetLastError () );
}
//SellOrder
if ((TradeHour12== Hour ())||(TradeHour23== Hour ())&& opensell == 0 ) //Signal Sell
{
  opensell= OrderSend ( Symbol (),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point , 0 , "time trader sell order " ,MagicNumber, 0 , Green );
   if (opensell < 0 ) Print ( "OrderSend OP_SELL failed, error: " , GetLastError () );

} 

귀하의 OrderClose가 잘못되었습니다. . . 매도 매수를 마감하기 위해 매도 시 매수를 엽니다. . . 입찰가에서 판매하는 경우 입찰에서 판매를 열어 구매한 판매를 마감합니다. . . 당신은 Ask에서 구매합니다.

 
RaptorUK :
귀하의 OrderClose가 잘못되었습니다. . . 매도 매수를 마감하기 위해 매도 시 매수를 엽니다. . . 입찰가에서 판매하는 경우 입찰에서 판매를 열어 구매한 판매를 마감합니다. . . 당신은 Ask에서 구매합니다.
또는 이미 주문을 선택했으므로 다음을 사용하십시오.
Closed = OrderClose ( OrderTicket () , OrderLots (), OrderClosePrice (), UseSlippage, Red );  
그리고 주문 유형 을 구분할 필요가 없습니다.
 

도와주셔서 감사합니다... 힌트로 코드를 수정했습니다. 다음과 같이 보입니다.

//+----------------------------------------------- -------------------+
//| 스턴덴트레이더.mq4 |
//| 더 마크 |
//| Es gibt gar keine Internetseite |
//+----------------------------------------------- -------------------+
#property copyright "Der Marc"
#속성 링크 "Es gibt gar keine Internetseite"

//위치티지 변수
외부 이중 Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int 미끄러짐=5;
외부 정수 MagicNumber = 1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss = 400;

//전역 변수
int BuyTicket;
int SellTicket;
이중 UsePoint;
int UseSlippage;

int 오픈 바이 = 0;
int 오픈 셀 = 0;
//+----------------------------------------------- -------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- -------------------+
정수 초기화()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+----------------------------------------------- -------------------+
//| 전문가 시작 기능 |
//+----------------------------------------------- -------------------+
정수 시작()
{
더블 FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
이중 위험=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
이중 Lot=NormalizeDouble(위험/(StopLoss/0.0001)*0.1,Digits2Round);
//====================== 로트 크기 및 위험을 결정하자 ===================== ==============
if ( 로트<최소 로트 )
{
로트=민롯;
}
Comment( "\n","허용되는 위험은 ",PercentOfFreeDepo, "% = ",Risk," 무료 금액 중 ",FreeDepo," in lot = ",Lot)입니다.
for(int i = OrdersTotal() - 1, i >= 0, i--)
{
if(주문선택(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < 현재 시간())
{
if (OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
오픈바이 = 0;
오픈셀 = 0;
}
if (OrderType() == OP_SELL)
{
마감 = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
오픈셀 = 0;
오픈바이 = 0;
}
}
}
}
//구매주문
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour()) ||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //구매 신호
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0,"타임 트레이더 매수 주문",MagicNumber,0,Blue);
if (openbuy < 0) Print("OrderSend OP_BUY 실패, 오류: ", GetLastError() );
}
//판매주문
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) // 신호 매도
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"타임 트레이더 매도 주문",MagicNumber,0,Green);
if (opensell < 0) Print("OrderSend OP_SELL 실패, 오류: ", GetLastError() );
}

//----
리턴(0);
}
//+----------------------------------------------- -------------------+
//핍 포인트 함수
더블 PipPoint(문자열 통화)
{
int CalcDigits = MarketInfo(통화, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) 이중 CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
반환(계산점);
}

//슬리피지 함수 가져오기
int GetSlippage(문자열 통화, int SlippagePips)
{
int CalcDigits = MarketInfo(통화, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) 이중 CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
반환(CalcSlippage);
}

백테스트를 실행하는 동안 하나의 오류 메시지 ERR_INVALID_TICKET(4108)이 있습니다.

 

모든 주문이 실행된 것은 아닙니다.

오류가 SL이 이전에 트리거되었다는 사실에 속할 수 있습니까?