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

 
Artyom Trishkin:

Expert Advisor に手動で開いたポジションのチケットを何らかの方法で指示し、それをトレースさせる必要があることは理解しています。

  1. 新しくオープンしたポジションをExpert Advisorのトラッキングに追加する必要があり、マジックを持たない場合、それは手動でオープンされたことを意味します。Expert Advisor は、このポジションの開始を、その開始の価格とバー上にマークするものとします。オブジェクトの名前には、そのようなオブジェクトに共通する名前、例えば "manual_"をプレフィックスとして含める必要があり、ポジションのチケットも存在する必要があります。その結果、オブジェクトの名前は次のようになる。"manual_12345678 "です。ここで、manual_ - 接頭辞、12345678 - ポジションチケット。
  2. Expert AdvisorのOnChartEvent()に追加して、オブジェクトのマウスクリックのイベントを監視します。オブジェクトの名前を分析し、その中にmanual_という部分文字列があれば、manual_の後にある数字を探します。この数字は、クリックした位置のチケットです。
  3. その後、EA/ターミナル/コンピュータ/ワールドを再起動したときに失われないように、見つかった番号を保存する必要があります...例えば、端末のリソースやグローバル変数 に。
  4. Expert Advisorはこのリソースを読み、そこからトローリングするポジションのチケットを取る必要がある
  5. トロールサイクルでは、選択した位置のチケットを取得し、保存されたチケットのリストの中からこの番号を探す必要があります。このようなチケットが見つかった場合、このチケットがあるポジションをトローリングする必要があります。
  6. ポジション数を変更した場合は、クローズしたポジションのチケットを確認し、保存されたリストの中から探し出す必要があります。そのようなチケットがリストに存在する場合、そのリストから削除しなければなりません。そのポジションはもはや存在せず、トローリングのためのチケットリストには、そのチケットに関係するものは何もありません。
こんな感じ。ロジックはクランク状に書かれているので、何かを考慮することはできないのですが......。


分かりやすい説明ありがとうございます、これで意味が分かりました。

私の場合、mqlレッスンは3(EURUSD)に設定することを推奨していますが、通貨の流動性は異なり、その速度も異なります。ドルペアやクロスの通常時の相場の目安として、どのような数値が考えられますか?

 
CopyOpen、CopyHigh、CopyLow、CopyCloseで多次元バッファを満たすことは可能ですか?説明では動的配列にコピーするとありますが、動的配列は多次元になりえます MQL5
 
Alexandr Sokolov:
CopyOpen、CopyHigh、CopyLow、CopyClose関数を 使用して多次元バッファを満たすことは可能ですか?説明では動的配列にコピーするとありますが、動的配列は多次元になりえます MQL5

1次元の配列を使用する...

 
Alexandr Sokolov:
関数CopyOpen、CopyHigh、CopyLow、CopyCloseを使って多次元バッファを埋めることは可能ですか?説明には動的配列にコピーすると書いてありますが、動的配列は多次元になります。

構造体の理解が困難な場合は、ArrayCopyRates

int  ArrayCopyRates( 
   void&     dest_array[][],    // массив, переданный по ссылке 
   string    symbol=NULL,       // инструмент 
   int       timeframe=0        // таймфрейм 
   );

しっかり理解した上でなら

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

こんにちは。いくつかのEAを組み合わせて構築してみましたが、ストラテジーテスターでは すべて正常に動作しています(ビジュアライゼーションモードで確認しました)。デモ口座で試したところ、時々、次のような問題が発生しました。注文が開かれ、削除されるのですが、これが1時間の間に起こり、時間が変わるまで続きます。注文の入力と削除を同時に行う条件があると思いましたが、削除が間に合わず、このブロックごと削除してしまいましたが、エラーは消えていません。誰かが困難でない場合は、エラーが発生した場所を教えてください。

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
      
   CurrHour = TimeHour(TimeCurrent());
   
   if (CloseByTime == true && DayOfWeek() == DayEnd && CurrHour >= CloseHour)
   {
      if (CountTrades() > 0 || CountStop() > 0) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek() && CurrHour == StartHour && ((!SetLimits && CountStop() == 0) || (SetLimits && CountLimits() == 0)) && CountTrades() == 0)
   {
      high = iHigh(Symbol(), 0, 1);
      low  = iLow(Symbol(), 0, 1);
      spread = MarketInfo(Symbol(),MODE_SPREAD);
      
      if ((high - low)/Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble(high + Indent*Point, Digits);
         sell = NormalizeDouble(low - Indent*Point, Digits);
        
      
         if (FixedLot > 0)
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true)
         {
            if (AccountBalance() < abalance) 
               Lots = getlotlast();
            else abalance = AccountBalance();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread*Point - TPP*Point);
            tp_buy  = ND(buy + spread*Point + TPP*Point);
         
            sl_sell = ND(sell + SLP*Point+spread*Point);
            sl_buy  = ND(buy-SLP*Point-spread*Point);
            
          if (iClose(NULL,1440,1) < iMA(NULL,1440,PeriodMA,0,MODE_EMA,PRICE_CLOSE,1)) 
                  OrderSendReliable(Symbol(), OP_SELLSTOP, Lots, (sell-spread*Point), Slippage, sl_sell,  tp_sell, comment, Magic, 0, Red);
                                                                         
                                                                        else
                  OrderSendReliable(Symbol(), OP_BUYSTOP,  Lots, (buy+spread*Point),  Slippage, sl_buy, tp_buy,  comment, Magic, 0, Blue);
                                                                       
         
            
         }else
         {
            tp_sell = ND(sell - MathAbs(buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +  MathAbs(buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs(buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs(buy-sell)*StopLossK);
         
            OrderSendReliable(Symbol(), OP_SELLLIMIT, Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0, Red);
            OrderSendReliable(Symbol(), OP_BUYLIMIT,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0, Blue);
         }
      }
   }
   return(0);
}
 
craft11111:

こんにちは。いくつかのEAを組み合わせて構築してみましたが、ストラテジーテスターでは すべて正常に動作しています(ビジュアライゼーションモードで確認しました)。デモ口座で試したところ、時々、次のような問題が発生しました。注文が開かれ、削除されるのですが、これが1時間の間に起こり、時間が変わるまで続きます。注文の入力と削除を同時に行う条件があると思いましたが、削除が間に合わず、このブロックごと削除してしまいましたが、エラーは消えません。どこがエラーなのかご指摘ください。

OrderSelectを 介したループでオーバーフローさせる必要がある。

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

私の理解では、条件が発生すると、順序選択だけの修正関数に遷移します。また、この部分を削除しても同じエラーが発生し、どのような状態が発生するのかがわからないことがあります。

void ModifyLoss()
{
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderType() == OP_BUY)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() < SL && (Ask - OrderOpenPrice())/Point>= BUP)
         {
            if (SL != ND(OrderStopLoss()))
               OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      } else
      if (OrderType() == OP_SELL)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() > SL && (OrderOpenPrice()-Bid)/Point >= BUP)
         {
            if (SL != ND(OrderStopLoss()))
                OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      }
   }
}
 
craft11111:

こんにちは。いくつかのEAを組み合わせて構築してみましたが、ストラテジーテスターでは すべて正常に動作しています(可視化モードで確認しました)。デモ口座で試したところ、時々、次のような問題が発生しました。注文が開かれ、削除されるのですが、これが1時間の間に起こり、時間が変わるまで続きます。注文の入力と削除を同時に行う条件があると思いましたが、削除が間に合わず、このブロックごと削除してしまいましたが、エラーは消えません。どこがエラーなのかご指摘ください。

関数Print(__FUNCTION__)またはPrint(こんなブロック、こんなパラメータ)で書く必要があります。機能/ブロックがトリガーされる順序を観察してください。最初に引き金になって、あってはならないこと、そこがその時の問題です。ここでは、それらが同時に発動するための、むしろ相容れない条件を記述した」という事実に依拠することは、得策ではありません。本来はトリガーしないはずのユニットが、外部パラメータによってトリガーしてしまったのかもしれませんし、ユニット内部の何かがトリガーしてしまったのかもしれません。

 

OnChartEvent() がテスターで動作しない。

テスターで動作可能なボタンを表示してください。例えば、クリックするとtrade = trueのフラグが立ちますが、もう一度クリックするとtrade = falseになります。

 
Ghabo:

OnChartEvent()がテスターで動作しない。

テスターで動作可能なボタンを表示してください。例えば、クリックするとtrade = trueのフラグが立ちますが、もう一度クリックするとtrade = falseになります。

OnTick()では、ボタン押下を制御します。条件によって、テスターで動作する場合はOnTick()で制御しますが、現実世界ではこの制御は実行されず、OnChartEvent()で制御されます。