출시 후 다음 조건에서 5분 차트의 과정을 따를 전문가 고문: - 페이지 12

 

코드 끝에 함수 삽입 -

 //+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -1.                  |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    tf  - таймфрейм                 ( 0 - текущий таймфрейм)                |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos ( string sym = "" , int tf = 0 , int op =- 1 , int mn =- 1 ) {
  datetime oot ;
  int      i , k = OrdersTotal () ;
 
  if ( sym == "" ) sym = Symbol () ;
  for ( i = 0 ; i < k ; i ++ ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
      if ( OrderSymbol () == sym ) {
        if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
          if ( op < 0 || OrderType () == op ) {
            if ( mn < 0 || OrderMagicNumber () == mn ) {
              if ( oot < OrderOpenTime ()) oot = OrderOpenTime () ;
            }
          }
        }
      }
    }
  }
  return ( iBarShift ( sym , tf , oot , True )) ;
}

그리고 그것이 작동하려면 구매 / 판매하기 전에 다음 줄을 삽입하십시오.

 if ( NumberOfBarOpenLastPos ( здесь сам всё расставь ) > 0 ) { //если на текущ. баре не было сделок 
//ххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххх
if ( Bid - iOpen ( NULL , 0 , 0 ) >= Delta * Point ) //Цена выросла на больше или = Delta пунктов
//продаем-
{
ticket = OrderSend ( Symbol () , 1 , Lots , Bid , 3 , Bid + StopLoss * Point , Bid - TakeProfit * Point ,
                 " продал " , MagicNumber , 22222 , Red ) ;
 
if ( ticket < 0 ){ Print ( " Ошибка открытия ордера SELL # " , GetLastError ()) ; return ( 0 ) ; }
}
//-------------------------------------------------------------------------
if ( iOpen ( NULL , 0 , 0 ) - Bid  > Delta * Point ) //цена упала более дельты - покупаем
{
ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , Bid - StopLoss * Point , Ask + TakeProfit * Point ,
            " Купил " , MagicNumber , 11111 , Green ) ;
 
if ( ticket < 0 ){ Print ( " Ошибка открытия ордера BUY # " , GetLastError ()) ; return ( 0 ) ; }
}
//ххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххх
}
그리고 무슨 일이 일어나는지 보십시오.
 
--
 NumberOfBarOpenLastPos ( " " , 0 ,  - 1 , MagicNumber )
 
두뇌싸움에서....
 
내일 해봐야겠네요...감사합니다.
모두 동일, 오류 ... 오류 ...
 
그리고 어떤 오류가 발생합니까? 여기에서 복사하세요.
 
이렇게 해보니 잘 컴파일 되었습니다. "함정"이 있습니까?

//------------------------------
 //+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -1.                  |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    tf  - таймфрейм                 ( 0 - текущий таймфрейм)                |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) {
  datetime oot;
  int      i, k=OrdersTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oot<OrderOpenTime()) oot=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sym, tf, oot, True));
}

int start()
{
if (NumberOfBarOpenLastPos()>0)
if(OrdersTotal()!=0)  return; //Выполнять только одну сделку.
//---

if (Ask - iOpen(NULL,0,0)>=Delta*Point) //Цена выросла  больше Delta пунктов - продаем!!!

{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"Продал");
 }
//-------------------------------------------------------------------------

if (iOpen(NULL,0,0)-Bid  >=Delta*Point) //цена упала больше Delta пунктов - покупаем!!!
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Купил");
 }
//----
return(0);
}
그러나 코드의 이 줄은 불필요할까요? :
if(OrdersTotal()!=0)  return; //Выполнять только одну сделку.
 
다시 불운.
위의 코드를 작동시키려고 합니다. 다음 텍스트와 함께 오류가 로그에 나타납니다.
18:38:23 '153085': 주문 매도 1.00 GBPUSD 2.0006 sl: 2.0019 tp: 2.0003 실패 [잘못된 S/L 또는 T/P]
무슨 뜻인가요?
 
int start ()
{
int total = OrdersTotal () ;
   if ( total < 1 )                           { // если нет открытых позиций
if ( NumberOfBarOpenLastPos ( "" , 0 ,  - 1 , MagicNumber ) > 0 ){
 
//---
 
if ( Ask - iOpen ( NULL , 0 , 0 ) >= Delta * Point ) //Цена выросла  больше Delta пунктов - продаем!!!
{
ticket = OrderSend ( Symbol () , OP_SELL , Lots , Bid , 3 , Bid + StopLoss * Point , Bid - TakeProfit * Point , " Продал " ) ;
if ( ticket < 0 ){ Print ( " Ошибка открытия ордера SELL # " , GetLastError ()) ; return ( 0 ) ; }
 
 }
//-------------------------------------------------------------------------
 
if ( iOpen ( NULL , 0 , 0 ) - Bid  >= Delta * Point ) //цена упала больше Delta пунктов - покупаем!!!
{
ticket = OrderSend ( Symbol () , OP_BUY , Lots , Ask , 3 , Bid - StopLoss * Point , Ask + TakeProfit * Point , " Купил " ) ;
if ( ticket < 0 ){ Print ( " Ошибка открытия ордера BUY # " , GetLastError ()) ; return ( 0 ) ; }
 }
//----
} //if (NumberOfBarOpenLastPos
} //if(OrdersTotal
return ( 0 ) ;
}
//------------------------------
 //+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -1.                  |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    tf  - таймфрейм                 ( 0 - текущий таймфрейм)                |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos ( string sym = "" , int tf = 0 , int op =- 1 , int mn =- 1 ) {
  datetime oot ;
  int      i , k = OrdersTotal () ;
 
  if ( sym == "" ) sym = Symbol () ;
  for ( i = 0 ; i < k ; i ++ ) {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES )) {
      if ( OrderSymbol () == sym ) {
        if ( OrderType () == OP_BUY || OrderType () == OP_SELL ) {
          if ( op < 0 || OrderType () == op ) {
            if ( mn < 0 || OrderMagicNumber () == mn ) {
              if ( oot < OrderOpenTime ()) oot = OrderOpenTime () ;
            }
          }
        }
      }
    }
  }
  return ( iBarShift ( sym , tf , oot , True )) ;
}
이렇게 하면 되겠다...
 
조금. 잘못된. 위에 수정...
 
salesman77 :
다시 불운.
위의 코드를 작동시키려고 합니다. 다음 텍스트와 함께 오류가 로그에 나타납니다.
18:38:23 '153085': 주문 매도 1.00 GBPUSD 2.0006 sl: 2.0019 tp: 2.0003 실패 [잘못된 S/L 또는 T/P]
무슨 뜻인가요?


1) 어떤 DC에서 MT4를 사용합니까?

2) 이 DC에서 허용 가능한 손절매와 이익실현 거리가 얼마입니까?