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

 

どうしてそんなことが可能なのでしょうか? 計算に問題があったのでは?

input double    T_P  =0.81;
input double    S_L  =0.35;

b_ep=price-atrH1200;
b_sl=b_ep-(b_ep*S_L)/100;
b_tp=b_ep+(b_ep*T_P)/100;

1.05 *0.81/100 =0.008505の ように見えます。

0.81%と0.35%ではなく、35%のストップと81%のテクプロフィットを提供します。

SellLimit(LOT_FOR_TRADE,s_ep,symb,s_sl,s_tp,ORDER_TIME_DAY,0,"SellLimit");

BuyLimit(LOT_FOR_TRADE,b_ep,symb,b_sl,b_tp,ORDER_TIME_DAY,0,"BuyLimit");

標準のSellLimit&BuyLimit ライブラリに あるメソッド


Print(s_ep,"s_ep");
Print(s_sl,"s_sl");
Print(s_tp,"s_tp");

プリントショー

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.04236745s_ep

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.25084094s_sl

2017.12.24 07:55:27.559 2017.01.03 16:54:17 0.521183725s_tp


 
SILVERPRINT:

どうしてこんなことが可能なのでしょうか? 計算に問題があったのでは?

1.05 *0.81/100 =0.008505の ように見えます。

0.81%と0.35%ではなく、35%のストップと81%のテクプロフィットを提供します。

標準のSellLimit&BuyLimit ライブラリに あるメソッド


プリントショー

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.04236745s_ep

2017.12.24 07:55:27.559 2017.01.03 16:54:17 1.25084094s_sl

2017.12.24 07:55:27.559 2017.01.03 16:54:17 0.521183725s_tp



同じコードを書き直しますが、すべての変数が宣言されているようにします。宣言する変数の種類を見てみる。そうすれば、適切な解決策はすぐそばにあるのです。

 
Vladimir Karputov:

同じコードを書き直しますが、すべての変数が宣言されているようにします。宣言する変数の種類を見てみる。そうすれば、正しい解決策にたどり着けるはずです。


//+------------------------------------------------------------------+
//|                                                       |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#include <Indicators\Trend.mqh>
#include <Indicators\Oscilators.mqh>
#include <Indicators\TimeSeries.mqh>
#include <Trade\Trade.mqh>
input double    T_P  =0.81;
input double    S_L  =0.35;
static int hour;
int h;
input int TIME_FOR_ACTION=16;
input int slowma=200;
input int fastwma=20;
input int mahours=20;
input double LOT_FOR_TRADE=0.1;
string symb;
MqlTick infotick;
MqlDateTime currentTime;
CiMA ValueofMA200;
CiMA ValueofMA20;
CiMA ValueofMAHour;
CiATR atr;
CTrade T_M;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   symb=_Symbol;
   ValueofMA200.Create(symb,PERIOD_D1,slowma,0,MODE_SMA,PRICE_CLOSE);
   ValueofMA20.Create(symb,PERIOD_D1,fastwma,0,MODE_SMA,PRICE_CLOSE);
   ValueofMAHour.Create(symb,PERIOD_H1,mahours,0,MODE_SMA,PRICE_CLOSE);
   atr.Create(symb,PERIOD_H1,200);


   atr.BufferResize(40);
   ValueofMA200.BufferResize(250);
   ValueofMA20.BufferResize(250);
   ValueofMAHour.BufferResize(250);

   T_M.LogLevel(LOG_LEVEL_ALL);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   RefCustom();
   SymbolInfoTick(symb,infotick);
   TimeToStruct(infotick.time,currentTime);

   if(1==1)
     {
      if(1==1)
        {
         double maD1200,maD120,maH120,atrH1200,price;

         maD1200=ValueofMA200.Main(0);
         maD120=ValueofMA20.Main(0);
         maH120=ValueofMAHour.Main(0);
         atrH1200=atr.Main(0);
         price=infotick.bid;
         double s_ep,s_sl,s_tp;
         double b_ep,b_sl,b_tp;


         if(1==1)
           {
            b_ep=price-atrH1200;
            b_sl=b_ep-(b_ep*S_L)/100;
            b_tp=b_ep+(b_ep*T_P)/100;
            T_M.BuyLimit(LOT_FOR_TRADE,b_ep,symb,b_sl,b_tp,ORDER_TIME_DAY,0,"BuyLimit");
           }
         if(1==1)
           {
            s_ep=price+atrH1200;
            s_sl=s_ep+(s_ep*S_L)/100;
            s_tp=s_ep-(s_ep*T_P)/100;

            T_M.SellLimit(LOT_FOR_TRADE,s_ep,symb,s_sl,s_tp,ORDER_TIME_DAY,0,"SellLimit");
           }
}

     }
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+
void RefCustom()
  {
   ValueofMA200.Refresh();
   ValueofMA20.Refresh();
   ValueofMAHour.Refresh();
   atr.Refresh();
  }
//+------------------------------------------------------------------+

 
SILVERPRINT:


エラーコンパイルしていない。

 
Vladimir Karputov:

エラーコンパイルできない。


すみません、今試してみてください。

 
SILVERPRINT:

すみません、今試してみてください。


おそらく一晩中でしょう。だから、あなたが何をしようとしているのか、まったく理解できないのです。

ひとことお願いします。

  • 宣言時に変数をINITIALIZEする
  • 割るときはintではなくdoubleで割る(例:数値100.0→double、数値100→int)。
  • このスタイルは何ですか if(1==1) - ?これはモンペだ、絶対にこんな書き方はするな。
  • 最後に、最も重要なことは、コードに3行だけ残すことです。

            b_ep=price-atrH1200;
            b_sl=b_ep-(b_ep*S_L)/100;
            b_tp=b_ep+(b_ep*T_P)/100;

  • で、明示的に変数を宣言して初期化します。例えばこんな感じ。

   double price=1.05848;
   double atrH1200=1.05168;
   double T_P=0.81;
   double S_L=0.35;

   double b_ep=price-atrH1200;
   double b_sl=b_ep-(b_ep*S_L)/100.0;
   double b_tp=b_ep+(b_ep*T_P)/100.0;
   DebugBreak();
 
Vladimir Karputov:

おそらく一晩で......だから、あなたがやろうとしていることは何一つ理解できないんです。

ひとことお願いします。

  • 宣言時に変数をINITIALIZEする
  • 割るときはintではなくdoubleで割る(例:数値100.0→double、数値100→int)。
  • このスタイルは何ですか if(1==1) - ?これはモンペだ、絶対にこんな書き方はするな。
  • 最後に、最も重要なことは、コードに3行だけ残すことです。

  • で、明示的に変数を宣言して初期化します。例えばこんな感じ。


ありがとうございます。

 
不思議なことに、この関数はゼロ以上のオーダーがあっても動作する。
if(OrdersTotal()==0)

大きな違いは ありませんが、機能が働かないところでは、預金全額を開放することもあります。

 
SILVERPRINT:
不思議なことに、この関数は、注文がゼロより多くても動作します。

大差は ないのですが、機能がうまく働かないところでは、預け入れが全部開いてしまうこともあるのです。

この機能のMT5ヘルプを開き、MT5での注文が何であるかを正しく理解していることを確認します。

 
F1を押しても押しても見つからない...。

他の文字の_Digitsを決定する方法を教えてください。
理由: