MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1672

 
Nerd Trader #:

不要なコードを削除しました。

もう完全に必死です、OnTickに送られた時のプリント変数まで追加して...。そして、もしそれが役に立ったなら :) OnTick


では常に false になっています。
bool BESet(double sl = 0, color arrow_color = 0, string order_type = ""){
  bool order = OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, arrow_color );
          if(!order) {
            ResetLastError();
            Print("!Ошибка ",order_type,". Причина: ", GetLastError());
            return false;
          }
          else {
            return true;
          }
}

bool BEActivate(){
  double unrealized_profit = 0;
  color arrow_color = 0;
  string order_type = "";
  double sl = 0;
  bool is_be = false; // если объявить true, то в OnTick всегда будет возвращаться true

  if(OrdersTotal() >= 1){
    for(int i = OrdersTotal() -1; i >= 0; i--){
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) continue;
      if(OrderType() == OP_BUY){
        if(OrderStopLoss() > OrderOpenPrice()) continue;
        unrealized_profit = NormalizeDouble(MathAbs(OrderOpenPrice() - Ask)/Point, 0);
        if(unrealized_profit >= save_zone && Ask > OrderOpenPrice()){
          is_be = BESet(NormalizeDouble(OrderOpenPrice()+breakeven*Point,Digits), clrGreenYellow, "Бай");
          Print("BE ",is_be);
        }
      }
      if(OrderType() == OP_SELL){
        ...
        ...
      }
    }
  }
    if(!is_be){
    Print("is_be return ",is_be);
    return false;
  }
  else{
    Print("is_be return ",is_be);
    return true;
  }
}

void OnTick()
{
  
  bool is_be = BEActivate();

  if(last_time > bar.time_open){
    bar.Initialize();
    Print("is_be ",is_be); //Всегда FALSE
    ...
  }
last_time = iTime(NULL, 0, 0);
}
 
MakarFX #:

どういう意味ですか?

Expert Advisorにインジケータを統合した経験を共有 できる人を探しています。

このデータを異なるTFで計算できるようにすること。

const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],

クラスによる実装をされている方はいらっしゃらないでしょうか。

クラスのロジックを理解したいので、勉強になると思います。

 
законопослушный гражданин #:

こんにちは、あなたは私が問題を解決するのを助けることができます。

1つ以上のトレードを開けないようにしてほしい。EAのロジックは、前の注文が決済されるまで、次の注文は開かないというものですが、このような長いローソク足で一連の案件が開くことがあります。このような状況を防ぐために、コードに何を追加すればよいかアドバイスをお願いします。

コードスニペット:

bCheckOrders()では、未決済注文だけでなく、保留注文(MODE_TRADES)も列挙しています。
 
Nerd Trader #:

あの...iOTiのvOrderModify()では常に1ですが、これはチケットではなく、OrderSend()操作のポジティブな結果、すなわち値 "1 "なのです。


ありがとうございます。 オリジナルのコードは私のものではないので、むやみに変更することはありません。効くし、効くし。

これで私の問題は解決するのでしょうか?

 
законопослушный гражданин #:

こんにちは、あなたは私が問題を解決するのを助けることができます。

1つ以上のトレードを開けないようにしてほしい。EAのロジックは、前の注文が決済されるまで、次の注文は開かないというものですが、このような長いローソク足で一連の案件が開くことがあります。このような状況を防ぐために、コードに何を追加すればよいかアドバイスをお願いします。

コードスニペット:

OnTick() を表示する
 
Mikhail Toptunov #:
Expert Advisorにインジケータの統合を実装した経験を共有 できる人を探しています。

このデータを異なるTFで計算できるようにすること。

クラスによる実装をされている方はいらっしゃらないでしょうか。

クラスのロジックを理解したいので、勉強になると思います。

rates_total = Bars
time[]      = Time[]
open[]      = Open[]
high[]      = High[]
low[]       = Low[]
close[]     = Close[]
 
MakarFX #:
OnTick() を表示する
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
   if(bCheckOrders() == true)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

  if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
     {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
      CloseOrder();
     }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
  }
 
законопослушный гражданин #:

ありがとうございます。 元のコードは私のものではないので、むやみに変更しないようにしています。効くし、効くし。

これで何か私の問題が解決するのでしょうか?

なーんだ、勘違いしてた、OrderSend()はチケットか-1を返すから、何も問題ないんだ。
 
законопослушный гражданин #:

OnTick() から bCheckOrders() を削除して、ハイライト 表示にしてみてください。

void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

  if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
     {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
      CloseOrder();
     }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Если нет открытых ордеров, то входим в условие
   if(bCheckOrders() == true)
     {
   // Тикет ордера
      int iOTi = 0;   
   
      iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   // Проверим открылся ли ордер
      if(iOTi > 0)
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
      else
   // Если нет, то получим ошибку
      vError(GetLastError());
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Если нет открытых ордеров, то входим в условие
   if(bCheckOrders() == true)
     {
   // Тикет ордера  
      int iOTi = 0;   
   
      iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   // Проверим открылся ли ордер
      if(iOTi > 0)
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
      else
   // Если нет, то получим ошибку
      vError(GetLastError());
     }
  }
 
Nerd Trader #:
なーんだ、勘違いしてた、OrderSend()はチケットか-1を返すから、何も問題ないんだ。

なるほど。

今後のために覚えておこうと思います。