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

 
Vitaly Muzichenko #:

私は口を挟む :)

DAX30指数=9から22まで相場がある

タイムフレームM15、H1などでセッションのバー数を調べるにはどうしたらいいでしょうか。

マキシム・クズネツォフ#:

(22*3600-9*3600)/PeriodSeconds(M15)

が、これは理想的には「9:00から22:00の間にこれだけのバーがあればいい」ということです。

時間枠が小さいほど誤差は大きくなりますが、実際にはほとんど小さくなります。履歴を利用して「Nバーごとに次のセッション」を計算することはできません。

もっとシンプルに...。

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

皆さん、こんにちは。

あなたの力が必要です。

EAには、現在の利益をカウントする機能が組み込まれています。

double GetProfitFromStart()
  {
   double lp=0,cp=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(lp+cp);
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

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

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot"   ,1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
       DrawLABEL("lab_Take" ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2)));
      TrailingOrders();
   }

void OnTickは上記のように構成されています。

条件を満たすと利益カウンターが0.0にリセットされるようにするには。

if(CountOrders()==0) && (GetProfitFromStart()>0)の場合。

すなわち、すべての注文が終了し、最後の注文が終了したときの利益の合計が>0であった場合?

 

MT4をインストールしました。ターミナルを閉じた後、引用符が保存されない - 毎回新しいものをロードする。

 
Maxim Kuznetsov #:

4でも、「先に開いて、後で修正 する」のがよいでしょう。

ストップロスとマーケットで同時にオープンすることができる人はそう多くはありません。

ちなみに、ストップロスはどこでも起こるわけではありません。ストップロス注文で取引したい場合は、ブローカーのサーバーで確認する必要があります。それは彼の個人的なサービス(クレジット、リスク、収益)であり、あなたが考えるところではありません、ストップロス注文の取引チャネルはありません。

ありがとうございます、そうなんです、ブローカーが違うとデモでも条件が違いすぎて表示されないんです。

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

皆さん、こんにちは。

あなたの力が必要です。

EAには、現在の利益をカウントする機能が組み込まれています。

void OnTickは上記のように構成されています。

条件を満たすと利益カウンターが0.0にリセットされるようにするには。

if(CountOrders()==0) && (GetProfitFromStart()>0)の場合。

すなわち、すべての注文が終了し、最後の注文が終了したときの利益の合計が>0だった場合?

この課題は、なかなか明確にはなっていません。毎回、計算機能が注文/ポジションを回り始め、ゼロからの利益をまとめます。

 double lp=0,cp=0;

何をゼロにしたいのか?オープンポジション/マーケットオーダーがない場合、カウント関数はゼロを返します。勝手にゼロになる)))

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

皆さん、こんにちは。

あなたの力が必要です。

条件を満たすと利益カウンターが0.0にリセットされるようにする方法。

すなわち、すべての注文が終了し、最後の注文が終了したときの利益の合計が>0?

具体的にどのような点がうまくいかないのでしょうか?

 

こんにちは。よろしくお願いします。

マイナスリターンのクローズドオーダーを探している。
合計では、私はすべての負のオーダーの結果を得ることはありません。

書くことを学んでいます。

double Minus_profit(){
 for (int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
          if (OrderCloseTime()>=time && OrderTicket()>ticket){
            if (OrderProfit()+OrderSwap()+OrderCommission()<0){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}}return(result);
}
 
Alexander Avksentyev #:

こんにちは。よろしくお願いします。

マイナスリターンのクローズドオーダーを探している。
合計では、私はすべての負のオーダーの結果を得ることはありません。

書き方を学ぼうとしているのです。

ぱっと見た感じ、端からポジションに目を通すと同時に、変数に終値を書き込んでいますね。直近で決済したポジションの時刻を取り込んでしまい、次の条件が成立しなくなることがあります。

OrderCloseTime()>=time

他のポジションの方が終値が低いため。これはすべてソーティングによりますが、標準的なソーティングではこれが問題になります。


この条件も修正

(OrderType() == OP_BUY || OP_SELL)

まで

(OrderType() == OP_BUY || OrderType() == OP_SELL)

履歴からポジションを取れば、OrderProfit()はすでにスワップや手数料を含んだ最終結果を保存しています。オープンポジションでは......いや、すべてを総括する必要がある。しかし、これは確かなことではありません、確認してみてください。

 
Nikita Chernyshov #:

ぱっと見た感じ、端からポジションを見ていって、終値の時間を変数に書き込んでいるようですね。直近で決済したポジションの時刻を取り込んでしまい、次の条件が成立しなくなることがあります。

他のポジションの方が終値が低いため。これはすべてソーティングによりますが、標準的なソーティングではこれが問題になります。


この条件も修正

まで

履歴からポジションを取れば、OrderProfit()はすでにスワップやコミッションを含んだ最終結果を保存しています。オープンポジションでは......いや、すべてを総括する必要がある。しかし、これは正確ではありませんので、ご確認ください。

ありがとうございます。

double Minus_profit(){
time=TimeCurrent();
 for (int i=0; i<OrdersHistoryTotal(); i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic){
        if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
          if (OrderProfit()+OrderSwap()+OrderCommission()<=0){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}}return(result);
}

さらに、利益がプラスの注文に出会ったら、結果をリセットして、マイナスの注文を探します。

 
Alexander Avksentyev #:

こんにちは。よろしくお願いします。

マイナスリターンのクローズドオーダーを探している。
合計では、私はすべての負のオーダーの結果を得ることはありません。

書くことを学んでいます。

このような場合、デバッガを使用することをお勧めします。

理由: