MQL5 dilini sıfırdan kendi kendine öğrenme - sayfa 21

 
Maxim Kuznetsov :

... burada insanlar bir kez olsun yeni gelenlere yardım etmeye çalışırlar.

Herkese iyi günler ve iyi bir ruh hali!

Bana yardım etmeye çalışan herkese teşekkürler! Yardımınızın sonucu zaten orada. Şimdi bilinçli olarak ihtiyacım olan bilgileri (ders kitabı, site belgeleri vb.) Kendi kendine eğitime devam ettiğim yardımı ile buluyorum. Bu betiğin kodunu yazmak için yalnızca MQL5 Reference kullandığım gerçeğine özellikle dikkat ediyorum!

Bugün New6.mq5 komut dosyasının değiştirilmiş bir sürümü olan New7.mq5 komut dosyasının kodunu gönderiyorum. Yeni komut dosyası, Zararı Durdur (zararı durdur) ve Kâr Al (kar al) seviyelerini ayarlama yeteneğini uygular. Bu senaryoda, daha önce söz verdiğim gibi, bir programlama okulunun 1. sınıf öğrencisi için erişilebilir bir sunumda her şeyi boyamaya çalıştım.

Saygılarımla, Vladimir.

 //+------------------------------------------------------------------+
//|                                                         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 :

Herkese iyi günler ve iyi bir ruh hali!

Bana yardım etmeye çalışan herkese teşekkürler! Yardımınızın sonucu zaten orada. Şimdi bilinçli olarak ihtiyacım olan bilgileri (ders kitabı, site belgeleri vb.) Kendi kendine eğitime devam ettiğim yardımı ile buluyorum. Bu betiğin kodunu yazmak için yalnızca MQL5 Reference kullandığım gerçeğine özellikle dikkat ediyorum!

Bugün New6.mq5 komut dosyasının değiştirilmiş bir sürümü olan New7.mq5 komut dosyasının kodunu gönderiyorum. Yeni komut dosyası, Zararı Durdur (zararı durdur) ve Kâr Al (kar al) seviyelerini ayarlama yeteneğini uygular. Bu senaryoda, daha önce söz verdiğim gibi, bir programlama okulunun 1. sınıf öğrencisi için erişilebilir bir sunumda her şeyi boyamaya çalıştım.

Saygılarımla, Vladimir.

Kodunuzda bir satır var:

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

Bu, kodda 'orderType1' ile karşılaşıldığında, "BUY_STOP" ile değiştirileceği anlamına gelir.

Yani, satır yerine:

 if ( orderType1 == "BUY_STOP" )

Bir satır olacak:

 if ( "BUY_STOP" == "BUY_STOP" )

Gerçekten istediğin bu mu?

 
Koldun Zloy :

Kodunuzda bir satır var:

Bu, kodda 'orderType1' ile karşılaşıldığında, "BUY_STOP" ile değiştirileceği anlamına gelir.

Yani, satır yerine:

Bir satır olacak:

Gerçekten istediğin bu mu?

Şimdi belgeleri daha dikkatli okuyacağım ve sonra cevaplayacağım.

Saygılarımla, Vladimir.

 

Koldun Zloy :

... Gerçekten istediğin bu mu?

Şu anda "evet".

Saygılarımla, Vladimir.

 
MrBrooklin :

Şu anda "evet".

İşte geliyorlar...

 
Vasiliy Sokolov :

İşte geliyorlar...

Peki, sana ne hakkında söyledim?))) Taban ve yine taban olmalı. Önce 3-4 ay boyunca ders kitabını okuyun / özetleyin ve sonra bir şeyler yazın. Bir yıl içinde OOP'ye başlayabilirsiniz.
 
MrBrooklin :

Şu anda "evet".

Saygılarımla, Vladimir.

Daha ayrıntılı olarak belirtilmesi gereken nokta budur. Bu elbette çalışan bir seçenektir, ancak çok beklenmedik))))

İlk önce betiğin ne yapacağına dair bir açıklama, şematik bir algoritma vermek daha iyidir. Daha az soru ve daha spesifik yorumlar olacak)

 
MrBrooklin :

Şu anda "evet".

Saygılarımla, Vladimir.

Temel olarak, 2 = 2 gibi yukarıdaki koşul her zaman doğrudur. Dolayısıyla if (condition deyimi) burada çalışmaz ve derleyici bu kod üzerinde bir uyarı verir.
 
Реter Konow :
Peki, sana ne hakkında söyledim?))) Taban ve yine taban olmalı. Önce 3-4 ay boyunca ders kitabını okuyun / özetleyin ve sonra bir şeyler yazın. Bir yıl içinde OOP'ye başlayabilirsiniz.

Evet, tabana kadar bile değil. Adamın kafası karışık. Gemi dibe gitti, ancak yelkenler özenle ona yapışıyor (kar al, zararı durdur, gelecekte takip ediyor).

Peter Konow'un fotoğrafı.
Temel olarak, 2 = 2 gibi yukarıdaki koşul her zaman doğrudur. Dolayısıyla if (condition deyimi) burada çalışmaz ve derleyici bu kod üzerinde bir uyarı verir.

Ve şimdi şubenin yazarı senin tavsiyene uymalı ve "Gördüğüm kadarıyla ben bir sanatçıyım!" demeli Peter.

 
Vasiliy Sokolov :

İşte geliyorlar...

Büyük olasılıkla, böyle bir tepkiden beri yanlış anlaşılan bir şey.

New6.mq5 scriptinde şu koşulu yazdım: "Al Stop ve Sell Stop bekleyen emirler için girdi yerine, bizim için yeni olan #define direktifini kullanacağız. script kodunda istenilen tipte bekleyen emirler ancak script çalıştırıldığında giriş parametrelerinde görüntülenmeyecektir.Orijinal emir tiplerini belirleyen değişkenleri orderType1 ve orderType2 olarak belirleyelim.Buna BUY_STOP isimlerini yazalım. ve bu değişkenler için "SELL_STOP".

Sizden bu koşulu uygulamak açısından neyi yanlış yaptığımı söylemenizi rica ediyorum.

Saygılarımla, Vladimir.