一度立ち上げたレートを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': order sell 1.00 GBPUSD opening at 2.0006 sl: 2.0019 tp: 2.0003 failed [Invalid S/L or T/P] (無効な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': order sell 1.00 GBPUSD opening at 2.0006 sl: 2.0019 tp: 2.0003 failed [Invalid S/L or T/P] (無効なS/LまたはT/P)。
これはどういうことなのでしょうか。


1) また、どのようなMT4を使っていますか?

2) このDCでは、ストップロスとテイクプロフィットの距離はどの程度まで許容されますか?