从头开始自学MQL5语言 - 页 21

 
Maxim Kuznetsov:

...这里的人正在努力帮助新人,这是一次。

大家今天好,心情好

谢谢大家努力帮助我!你 的帮助的结果已经在那里了。现在我有意识地寻找我需要的信息(教程、网站文档等),这有助于我继续自学。我想强调的是,我只用了MQL5的参考资料来写这个脚本代码!

今天,我粘贴了New7.mq5脚本的代码,它是New6.mq5脚本的改进版。新的脚本能够设置Stop Loss(止损)和Take Profit(获利)水平。我试图按照我之前的承诺,以一个一年级程序员可以理解的形式来描述这个脚本中的一切。

问候,弗拉基米尔。

//+------------------------------------------------------------------+
//|                                                         New7.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#property script_show_inputs
//---
/* Продолжаем изучение языка программирования MQL5. В этот раз мы добавим в код скрипта, созданный
   нами ранее под именем New6.mq5, возможность устанавливать уровни Stop Loss (остановить убыток)
   и Take Profit (взять прибыль). Данные уровни позволят в ходе торговли автоматизировать процесс
   ограничения убытков и фиксации прибыли в то время, когда у нас отсутствует возможность находиться 
   перед торговым терминалом. Во входных параметрах скрипта создадим две переменные: SL (стоп лосс)
   и TP (тейк профит). Для них применим модификатор input и тип данных double. Чтобы постоянно не
   повторять комментарии, написанные в предыдущем скрипте New6.mq5, мы уберем всё лишнее и будем
   пояснять только те участки кода, которые добавим в данном скрипте. Итак, приступим. По нашей
   задумке нужно написать часть кода скрипта, который будет отвечать за Stop Loss и Take Profit.
   Снова обращаемся к Справочнику MQL5, в котором ищем раздел MqlTradeRequest. В нём мы находим
   информацию о том, что необходимо создать ещё два запроса: request.sl (для уровня Stop Loss ордера)
   и request.tp (для уровня Take Profit ордера). Дописываем в скрипт недостающие части кода.*/

/* Добавим в код скрипта необходимые переменные SL и TP.*/
input double SL=300;                 //Стоп лосс
input double TP=500;                 //Тейк профит
//---
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTradeRequest request= {0};
   MqlTradeResult result= {0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);

/* Теперь создаем два запроса на торговый сервер: request.sl и request.tp, в котором указываем, где
   должны находиться уровни стоп лосс и тейк профит относительно цены отложенного ордера "BUY_STOP".
   Уровень SL должен быть ниже цены (поэтому пишем price-SL*point), а уровень TP должен быть выше цены
   (поэтому пишем price+TP*point). Для нормализации уровней SL и TP мы применим функцию преобразования
   данных NormalizeDouble, где обязательно умножим каждый из уровней на point (размер одного пункта)
   и укажем digits (количество знаков после запятой).*/
      request.sl=NormalizeDouble(price-SL*point,digits);      
      request.tp=NormalizeDouble(price+TP*point,digits);
//---
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
     {
      request.type=ORDER_TYPE_SELL_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
      
/* Точно также создадим ещё два новых запроса на торговый сервер: request.sl и request.tp, в котором укажем,
   где должны находиться уровни стоп лосс и тейк профит относительно цены отложенного ордера "SELL_STOP".
   Уровень SL теперь должен находиться выше цены (поэтому пишем price+SL*point), а уровень TP должен 
   находиться ниже цены (поэтому пишем price-TP*point). Снова для нормализации уровней SL и TP мы применим
   функцию преобразования данных NormalizeDouble, где обязательно умножим каждый из уровней на point (размер
   одного пункта) и укажем digits (количество знаков после запятой).*/
      request.sl=NormalizeDouble(price+SL*point,digits);      
      request.tp=NormalizeDouble(price-TP*point,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

/* Всё! Наш новый скрипт готов. Компилируем и запускаем скрипт. Как компилировать и запускать скрипт мы
   уже узнали, когда создавали скрипт New2.mq5.*/

//+------------------------------------------------------------------+
 
MrBrooklin:

大家今天好,心情好

感谢每一位试图帮助我的人!我很感激。你 的帮助已经有了结果。现在有意识地寻找我需要的信息(教程、网站文档等),在其帮助下,我继续自学。我想强调的是,我只用了MQL5的参考资料来写这个脚本代码!

今天,我粘贴了New7.mq5脚本的代码,它是New6.mq5脚本的改进版。新的脚本能够设置Stop Loss(止损)和Take Profit(获利)水平。我试图按照我之前的承诺,以一个一年级程序员可以理解的形式来描述这个脚本中的一切。

问候,弗拉基米尔。

你的代码里有一行。

#define       orderType1 "BUY_STOP"   //Тип ордера UP

这意味着,当代码中出现'orderType1'时,它将被替换为 "BUY_STOP"。

就是说,代替下面这行。

if( orderType1 == "BUY_STOP" )

"BUY_STOP "将被替换成以下字符串。

if( "BUY_STOP" == "BUY_STOP" )

这就是你真正想要的吗?

 
Koldun Zloy:

你的代码里有一行。

这意味着,当代码中遇到'orderType1'时,它将被'BUY_STOP'所取代。

所以,不要用下面这句话来代替。

这将是一个字符串。

这就是你真正想要的吗?

我再研究一下文件,以后再回答你。

真诚的,弗拉基米尔。

 

Koldun Zloy:

...这真的是你想要的吗?

就目前而言,是的。

尊敬的弗拉基米尔。

 
MrBrooklin:

就目前而言,是的。

在这里,我们开始...

 
Vasiliy Sokolov:

我们到了...

好吧,我是怎么告诉你的?)必须有一个基地和另一个基地。首先你要读/看3-4个月的教科书,然后写点东西。一年后,你可以开始OOP。
 
MrBrooklin:

就目前而言,是的。

尊敬的弗拉基米尔。

这是我应该写得更详细的一点。这当然是一个可行的方案,但太意外了))))。

最好是先对脚本要做的事情进行描述,即一个算法的示意图。问题会更少,发言会更具体)

 
MrBrooklin:

就目前而言,是的。

尊敬的弗拉基米尔。

事实上,上面的条件总是真的,就像2=2。这就是为什么if(条件运算符)在这里不起作用,而且编译器会对这样的代码产生一个警告。
 
Реter Konow:
好吧,我跟你说过什么了?)必须有一个基地和另一个基地。首先阅读/评论一本教科书3-4个月,然后写点东西。一年后,你可以开始OOP。

这甚至不是关于基地的问题。这个人的思想很混乱。船已经下沉,但船帆(止盈、止损、未来跟踪)正被仔细地塑造出来。

ReTeg Konow:
事实上,上面的条件总是真的,就像2=2。所以if(条件运算符)在这里不起作用,编译器会对这种代码发出警告。

现在分支的作者应该听从你的建议,彼得,说 "我是这样看的,我是个艺术家!"。

 
Vasiliy Sokolov:

在这里,我们开始...

我一定是误解了什么,因为我得到了这样的反应。

我在脚本New6.mq5中写了以下条件:"对于挂单Buy Stop和Sell Stop,应用#define指令,而不是输入。它将允许我们在脚本代码中指定必要的挂单类型,但当脚本 运行时,它们将不会显示在脚本的输入参数 中。让我们设置定义挂单类型的变量orderType1和orderType2。我们将这些变量命名为 "BUY_STOP "和 "SELL_STOP"。

请告诉我在执行这个条件 时我做错了什么。

问候,弗拉基米尔。