Вопросы от начинающих 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

А дает 35% стоп и 81% текпрофит вместо 0.81% и 0.35%

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

А дает 35% стоп и 81% текпрофит вместо 0.81% и 0.35%

Метод из стандартной библиотеки 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:

Извиняюсь, сейчас попробуйте.


Возможно ночь - поэтому я ВООБЩЕ не понимаю ЧТО Вы пытаетесь сделать.

Совет:

  • при объявлении ИНИЦИАЛИЗИРУЙТЕ переменные
  • когда делите, делите на double, а не на int (например число 100.0 -> double, число 100 -> int)
  • что это за стиль 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;

  • а переменные объявите и инициализируйте явно. Например так:

   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:

Возможно ночь - поэтому я ВООБЩЕ не понимаю ЧТО Вы пытаетесь сделать.

Совет:

  • при объявлении ИНИЦИАЛИЗИРУЙТЕ переменные
  • когда делите, делите на double, а не на int (например число 100.0 -> double, число 100 -> int)
  • что это за стиль if(1==1) - ? Это чудовищно, никогда так не пишите
  • последнее, самое главное, оставьте в коде всего три строки, 

  • а переменные объявите и инициализируйте явно. Например так:


Спасибо невероятно  помогло.

 
Странно но функция, работает, даже если ордеров больше чем ноль.
if(OrdersTotal()==0)

Так то не особенно что то меняет, но где функция не работает может и наоткрывать на весь депозит.

 
SILVERPRINT:
Странно но функция, работает, даже если ордеров больше чем ноль.

Так то не особенно что то меняет, но где функция не работает может и наоткрывать на весь депозит.

Откройте справку МТ5 по функции и убедитесь, что Вы правильно понимаете что такое ордер в МТ5

 
Нажимал-нажимал F1, так и не нашёл..

Подскажите, пожалуйста, как определить _Digits для другого символа?