//+------------------------------------------------------------------+//| 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.*/inputdouble SL=300; //Стоп лоссinputdouble TP=500; //Тейк профит//---inputint Distance=100; //Отступ отложенного ордера от текущей ценыinputdouble Lots=0.01; //Фиксированный размер лотаinputlong Pending_magic=86513; //Магический номер ордера//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
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.*///+------------------------------------------------------------------+
...这里的人正在努力帮助新人,这是一次。
大家今天好,心情好
谢谢大家努力帮助我!你 的帮助的结果已经在那里了。现在我有意识地寻找我需要的信息(教程、网站文档等),这有助于我继续自学。我想强调的是,我只用了MQL5的参考资料来写这个脚本代码!
今天,我粘贴了New7.mq5脚本的代码,它是New6.mq5脚本的改进版。新的脚本能够设置Stop Loss(止损)和Take Profit(获利)水平。我试图按照我之前的承诺,以一个一年级程序员可以理解的形式来描述这个脚本中的一切。
问候,弗拉基米尔。
大家今天好,心情好
感谢每一位试图帮助我的人!我很感激。你 的帮助已经有了结果。现在有意识地寻找我需要的信息(教程、网站文档等),在其帮助下,我继续自学。我想强调的是,我只用了MQL5的参考资料来写这个脚本代码!
今天,我粘贴了New7.mq5脚本的代码,它是New6.mq5脚本的改进版。新的脚本能够设置Stop Loss(止损)和Take Profit(获利)水平。我试图按照我之前的承诺,以一个一年级程序员可以理解的形式来描述这个脚本中的一切。
问候,弗拉基米尔。
你的代码里有一行。
这意味着,当代码中出现'orderType1'时,它将被替换为 "BUY_STOP"。
就是说,代替下面这行。
"BUY_STOP "将被替换成以下字符串。
这就是你真正想要的吗?
你的代码里有一行。
这意味着,当代码中遇到'orderType1'时,它将被'BUY_STOP'所取代。
所以,不要用下面这句话来代替。
这将是一个字符串。
这就是你真正想要的吗?
我再研究一下文件,以后再回答你。
真诚的,弗拉基米尔。
Koldun Zloy:
...这真的是你想要的吗?
就目前而言,是的。
尊敬的弗拉基米尔。
就目前而言,是的。
在这里,我们开始...
我们到了...
就目前而言,是的。
尊敬的弗拉基米尔。
这是我应该写得更详细的一点。这当然是一个可行的方案,但太意外了))))。
最好是先对脚本要做的事情进行描述,即一个算法的示意图。问题会更少,发言会更具体)
就目前而言,是的。
尊敬的弗拉基米尔。
好吧,我跟你说过什么了?)必须有一个基地和另一个基地。首先阅读/评论一本教科书3-4个月,然后写点东西。一年后,你可以开始OOP。
这甚至不是关于基地的问题。这个人的思想很混乱。船已经下沉,但船帆(止盈、止损、未来跟踪)正被仔细地塑造出来。
事实上,上面的条件总是真的,就像2=2。所以if(条件运算符)在这里不起作用,编译器会对这种代码发出警告。
现在分支的作者应该听从你的建议,彼得,说 "我是这样看的,我是个艺术家!"。
在这里,我们开始...
我一定是误解了什么,因为我得到了这样的反应。
我在脚本New6.mq5中写了以下条件:"对于挂单Buy Stop和Sell Stop,应用#define指令,而不是输入。它将允许我们在脚本代码中指定必要的挂单类型,但当脚本 运行时,它们将不会显示在脚本的输入参数 中。让我们设置定义挂单类型的变量orderType1和orderType2。我们将这些变量命名为 "BUY_STOP "和 "SELL_STOP"。
请告诉我在执行这个条件 时我做错了什么。
问候,弗拉基米尔。