初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 828

 
ごあいさつ問題は、もっと論理的なことです。
いわゆるアンチマーチンゲール系で、増加数に制限がある。利益で決済した場合、次のロットは倍率が上がります。損失が発生した場合、または連続して利益を得たポジションの数が指定された数を超えた場合、ロットは開始ロットと同じになります。
指定された収益ポジション数を超えたら、再び増加のサイクルを始めるにはどうしたらよいですか?
int K_U_=5;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);//лот последней закрытой позиции
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }


/

 
lil_lil:
ごあいさつ問題は、もっと論理的なことです。
いわゆるアンチマーチンゲール系で、増加数に制限がある。利益で決済した場合、次のロットは倍率が上がります。損失が発生した場合、または連続して利益を得たポジションの数が指定された数を超えた場合、ロットは開始ロットと同じになります。
指定された収益ポジション数を超えたら、再び増加のサイクルを始めるにはどうしたらよいですか?


/

ストップロス・テイクプロフィットコードの 例:ロットサイズは、グローバルプログラムレベル(ヘッダー内)で宣言される「ExtLot」変数に格納(上書き、増加、最小値にリセット)されます。OnTradeTransaction()は、「Market Exit」タイプの取引を捕らえ、取引がどのように終了したかをチェックします - Take ProfitまたはStop Lossで。

         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               ExtLot*=2.0;
            else if(deal_reason==DEAL_REASON_TP)
               ExtLot=m_symbol.LotsMin();
           }

ストップロスの場合はロットを2倍に し、テイクプロフィットの 場合はロットを最小値に戻します。


注意:Expert Advisor 自体のストップロスとテイクプロフィットの計算が少し間違っていますが、コードはすぐに再公開される予定です。

 
Vladimir Karputov:

ストップロス・テイクプロフィットコードの 例:ロットサイズは、グローバルプログラムレベル(ヘッダー内)で宣言された「ExtLot」変数に格納(上書き、増加、最小値にリセット)されます。OnTradeTransaction()は、「Market Exit」タイプの取引を捕らえ、取引がどのように終了したかをチェックします - Take ProfitまたはStop Lossで。

ストップロスの場合はロットを2倍に し、テイクプロフィットの 場合はロットを最小値に戻します。


注:Expert Advisorでストップロスとテイクプロフィットの少し間違った計算である - しかし、すぐにコードを再公開した。

利益が出ている取引が何回続いているかを計算し、5回を超えたら初期ロットに戻し、ポジション6は初期ロットで開き、ポジション7はボリューム=ロット6に係数をかけたもので開くように する、といった具合です。さらに儲かるポジションが5つできたら、最初のロットに戻る。

儲かるポジションは20連発そのロットは、1、2、4、8、16、1、2、4、8、16、1、2、4、8、16のはずです。


 
lil_lil:

連続して利益が出た取引の回数を計算し、5回を超えたら初期ロットに戻し、ポジション6は初期ロットで開き、ポジション7は出来高=ロット6に係数をかけたもので開くように する、などです。さらに儲かるポジションが5つできたら、最初のロットに戻る。

儲かるポジションは20連発そのロットは、1、2、4、8、16、1、2、4、8、16、1、2、4、8、16のはずです。


ロットカウント機能でスタティック変 数を使用する必要があります。その仕組みはこうだ。

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   static int counter=0;
   for(int i=0;i<18;i++)
     {
      Print(counter);
      counter++;
      if(counter==5)
         counter=0;
     }
  }
//+------------------------------------------------------------------+

結果

0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
ファイル:
Test_1.mq5  2 kb
 
Vladimir Karputov:

ロットカウント機能でスタティック変 数を使用する必要があります。その仕組みはこうだ。

結果

例に従ってリセットしたのですが、ロットの増加の順番がつかめません

儲かるポジションは20個、並んでいる。彼らのロットは、1、2、4、8、16、1、2、4、8、16、1、2、4、8、16、1、1、1、1、1、..........のはずですが、1、2、4、8、16、1、1、1、1、......のはずです。

どうしたんですか?

int K_U_=5;  double   Lots=1.0;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }
  
//+------------------------------------------------------------------

int CountProfit(const string Symb,const long MagicNumber=0)
  {
    int counter=0;
   ulong Ticket;

   if(HistorySelect(0,LONG_MAX))
      for(int i=HistoryDealsTotal()-1; i>=0; i--){
      
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {
            if(HistoryDealGetDouble(Ticket,DEAL_PROFIT)>0)
            counter++; else
               break;
           }
           }
   if(counter==K_U_)
      counter=0;
   return(counter);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LotLastCloPos(const string Symb,const long MagicNumber=0)
  {
   ulong Ticket;
   double lot_=0;

   if(HistorySelect(0,LONG_MAX))
      for(int i=0; i<HistoryDealsTotal(); i++)
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {

            lot_=HistoryOrderGetDouble(Ticket,ORDER_VOLUME_INITIAL);

           }

   return(lot_);
  }
 
lil_lil:

例にしたがってゼロにするのですが、ロットの増加の順番がつかめません

儲かるポジションは20個、並んでいる。彼らのロットは、1、2、4、8、16、1、2、4、8、16、1、2、4、8、16のはず ですが、1、2、4、8、16、1、1、 1、1.............となっているのです。

どうしたんですか?

では、やはりOnTradeTransactionを 普通に使うのは嫌なのでしょうか?では、全取引履歴(1970年以降)をEXACTLYに要求するのがいいのですか?なぜ?

 
Vladimir Karputov:

では、OnTradeTransactionで 正しく動作させたくないということでしょうか?では、1970年以降のすべての取引履歴を要求するのがよいのでしょうか?なぜ?

理由を見つけた、ブラケット。

私がしたくないというのはどういう意味ですか?OnTradeTransactionは 私の質問とどんな関係があるのですか?)

 

さて、私の質問の2つ前の投稿に、計算例がありますね。

ありがとうございます。

 
lil_lil:

理由を見つけた、ブラケット。

したくないとはどういう意味ですか?OnTradeTransactionは 私の質問とどんな関係があるのでしょうか;)

取引履歴を聞くだけ

HistorySelect(0,LONG_MAX)

は、1970年以降のその取引口座の履歴をすべて、すべて、すべて要求することを意味します。これは非常にサブオプティカルなことです。

  • その口座で何千もの取引がある場合はどうでしょうか?
  • もし、(神頼みで)この要求を全ての刻み目にしたらどうでしょう?

 

取引履歴と連動する機能を教えてください。

最後の取引の開始日、終了日、出来高、財務結果、その種類(買いか売りか)の情報を得る必要があるのですが。

同様の機能をお持ちの方は、ぜひご紹介ください。

理由: