Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1009

 
Maxim Kuznetsov:
такое ощущение что оригинал этого текста родом из параллельной вселенной, был дважды переведён гугл-транслейтом и потом пересказан Алисой :-)

Хорошо. Сейчас по проще напишу.  Есть функция, основе которой можно найти последний лот. Она так и называется FindLastLots. А я хочу сделать функцию которая не просто ищет последний лот, а с помощью которой можно менять Lots. То есть, если extern lots = 0.01; мне нужно что бы после стоп лоса, я мог, при помощи написанной функции, поменять lots = 0.01, скажем на 0.04. Не используя умножение. И вот здесь мне нужна помощь, что бы понять как вообще подобное можно реализовать. 

double FindLastLots()
  {
   double oldlots=0;
   int oldticket;
   int ticket=0;

   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               oldlots= OrderLots();
               ticket = oldticket;
              }
           }
        }
     }
   return(oldlots);
  }
Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
Corvin85:

...

поменять lots = 0.01, скажем на 0.04. Не используя умножение.

...

Ну... если проблемы с умножением, то можно сложением получить желаемый результат.

 
Alexey Viktorov:

Ну... если проблемы с умножением, то можно сложением получить желаемый результат.

-:)

без слов
 
Может в эту функцию добавить цикл while, что бы уже в выбранных ордерах по очереди перебирать внешнюю переменную? Но как мне потом "возвращаемое значение" вытащить и использовать?
 
Alexey Viktorov:

Ну... если проблемы с умножением, то можно сложением получить желаемый результат.

Мне понятен Ваш сарказм, но, что в случаи с умножение или с вычислением, множителей должно быть столько же, сколько и внешних переменных Lots. Это не выход из ситуации. Хотя скажу честно, я об этом задумывался... 

 
Здравствуйте!!! делаю советник основываясь на таймфрэйме М5....но сигналы срабатывают (к примеру в 9:33, 12:11) и т.д.....подскажите, как открыть ордер на новой свече, если сигнал был на текущей?
 
Corvin85:

Мне понятен Ваш сарказм, но, что в случаи с умножение или с вычислением, множителей должно быть столько же, сколько и внешних переменных Lots. Это не выход из ситуации. Хотя скажу честно, я об этом задумывался... 

Я сейчас не вспомню подробности, но мне заказывали что-то замудрёное в вычислении лота. В результате была найдена формула по которой производилось вычисление.

Может вам лучше подробно озвучить порядок? Тогда кто-то может эту формулу подсказать.

 
Alexey Viktorov:

Я сейчас не вспомню подробности, но мне заказывали что-то замудрёное в вычислении лота. В результате была найдена формула по которой производилось вычисление.

Может вам лучше подробно озвучить порядок? Тогда кто-то может эту формулу подсказать.

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Lot  = 0.01;
extern double Lot2  = 0.02;
extern double Lot3  = 0.05;
extern double Lot3  = 0.07;
//----------- И так далее-------//

Есть несколько внешних переменных Lot. Если ордер закрылся Стоплоссом, то новый ордер открывает с новым лотом, который указан во внешней переменной. (наверно так надо было изначально написать) И вот тут загвоздка. Я просто не знаю как это правильно написать в коде. И как писал выше, ни какое умножение или вычисление, ни  какой внешний множитель не поможет. Нужно как то перебирать из закрытых ордеров данные ...

 
Corvin85:

Есть несколько внешних переменных Lot. Если ордер закрылся Стоплоссом, то новый ордер открывает с новым лотом, который указан во внешней переменной. (наверно так надо было изначально написать) И вот тут загвоздка. Я просто не знаю как это правильно написать в коде. И как писал выше, ни какое умножение или вычисление, ни  какой внешний множитель не поможет. Нужно как то перебирать из закрытых ордеров данные ...

при открытии ордера пишите ему в коммент номер правила/переменной по которому его открываете.

потом когда будете рыть историю - вытаскиваете этот номер, добавляете к нему 1 и получаете новый номер правила

 
Corvin85:

Есть несколько внешних переменных Lot. Если ордер закрылся Стоплоссом, то новый ордер открывает с новым лотом, который указан во внешней переменной. (наверно так надо было изначально написать) И вот тут загвоздка. Я просто не знаю как это правильно написать в коде. И как писал выше, ни какое умножение или вычисление, ни  какой внешний множитель не поможет. Нужно как то перебирать из закрытых ордеров данные ...

Поэкспериментируйте с таким кодом, возможно это Вам нужно

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict

input double Lot_01  = 0.1;
input double Lot_02  = 0.2;
input double Lot_03  = 0.3;
input double Lot_04  = 0.4;
input double Lot_05  = 0.5;
input double Lot_06  = 0.6;
input double Lot_07  = 0.7;

double GetNextLot(const double last_lot)
{
   if(last_lot>=Lot_07) return(Lot_07);
   if(last_lot>=Lot_06) return(Lot_07);
   if(last_lot>=Lot_05) return(Lot_06);
   if(last_lot>=Lot_04) return(Lot_05);
   if(last_lot>=Lot_03) return(Lot_04);
   if(last_lot>=Lot_02) return(Lot_03);
   if(last_lot>=Lot_01) return(Lot_02);
   return(Lot_01);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print(Lot_01," ---> ",GetNextLot(Lot_01));
   Print(Lot_02," ---> ",GetNextLot(Lot_02));
   Print(Lot_03," ---> ",GetNextLot(Lot_03));
   Print(Lot_04," ---> ",GetNextLot(Lot_04));
   Print(Lot_05," ---> ",GetNextLot(Lot_05));
   Print(Lot_06," ---> ",GetNextLot(Lot_06));
   Print(Lot_07," ---> ",GetNextLot(Lot_07));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
void OnTick()
  {

   
  }
//+------------------------------------------------------------------+

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.7 ---> 0.7

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.6 ---> 0.7

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.5 ---> 0.6

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.4 ---> 0.5

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.3 ---> 0.4

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.2 ---> 0.3

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.1 ---> 0.2

в мою функцию GetNextLot() будете подавать обьем последнего закрытого ордера, а она будет возвращать следующее значение настройки Lot_XX

единственное ограничение в таком коде это настройки лотов должны быть по возрастанию - ну думаю код простой и понятный, переделаете под свои задачи