robot oluşturmak - sayfa 8

 

ÇOK TEŞEKKÜR EDERİM!!!

Mevcut grafik üzerinde ZigZagColor göstergesini oluşturan ve Expert Advisor'ı kapattıktan sonra silen program kodu şöyle görünür:

EA başlatma bloğunda

 //--- create handle of the indicator iCustom
   handle_iCustom= iCustom (m_symbol.Name(), Period (), "Examples\\ZigzagColor" ,
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd ( ChartID (), 0 ,handle_iCustom);

EA başlatmadan kaldırma bloğunda

( Bu kodu kullanacaklar için DİKKAT ! Kodun bu versiyonu orta seviyedir ve sadece gösterge ayarları için geçerlidir Inp_ZZ_Depth=80 ; Inp_ZZ_Deviation=20 ; Inp_ZZ_Backstep=0 ; diğer ayarlarla gösterge silinmez! deinitialization bloğundaki diğer ayarlarla silinecek gösterge , 80,20,0 yerine bunları belirtmeniz gerekir.)

 //---
   ChartIndicatorDelete ( 0 , 0 , "ZigZag(80,20,0)" );

Şimdi, nasıl yapılacağını anlamak için kalır, böylece gösterge ayarları değiştirildiğinde, aynı zamanda silinir. Bu seçeneği denedim:

 //---
   ChartIndicatorDelete ( 0 , 0 , "ZigZag(" +Inp_ZZ_Depth+ "," +Inp_ZZ_Deviation+ "," +Inp_ZZ_Backstep+ ")" );

Bu seçenekle, herhangi bir ayar için gösterge kaldırılır , ancak danışmanı derlerken, editör bir sayıdan bir dizgeye örtük dönüştürme hakkında 3 uyarı yazar:

implicit conversion from 'number' to 'string'   ZigZag_Fibonacci_(M1).mq5       230     38

Her şeyin şu değerlerle ilgili olduğundan şüpheleniyorum: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+", "+Inp_ZZ_Backstep+". Genel olarak, MQL5 programlama dilini daha fazla incelemeniz gerekir.

Desteğiniz için hepinize bir kez daha teşekkür ederim!!!

Saygılarımla, Vladimir.

 
MrBrooklin :

ÇOK TEŞEKKÜR EDERİM!!!

Mevcut grafikte ZigZagColor göstergesini oluşturan ve Expert Advisor'ı kapattıktan sonra kaldıran son kod şöyle görünür:

EA başlatma bloğunda

EA başlatmadan kaldırma bloğunda

( Bu kodu kullanacaklar için DİKKAT ! Kodun bu versiyonu orta seviyedir ve sadece gösterge ayarları için geçerlidir Inp_ZZ_Depth=80 ; Inp_ZZ_Deviation=20 ; Inp_ZZ_Backstep=0 ; diğer ayarlarla gösterge silinmez! deinitialization bloğundaki diğer ayarlarla silinecek gösterge , 80,20,0 yerine bunları belirtmeniz gerekir.)

Şimdi, nasıl yapılacağını anlamak için kalır, böylece gösterge ayarları değiştirildiğinde, aynı zamanda silinir. Bu seçeneği denedim:

Bu seçenekle, herhangi bir ayar için gösterge kaldırılır , ancak danışmanı derlerken, editör bir sayıdan bir dizgeye örtük dönüştürme hakkında 3 uyarı yazar:

Her şeyin şu değerlerle ilgili olduğundan şüpheleniyorum: "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+", "+Inp_ZZ_Backstep+". Genel olarak, MQL5 programlama dilini daha fazla incelemeniz gerekir.

Desteğiniz için hepinize bir kez daha teşekkür ederim!!!

Saygılarımla, Vladimir.

 ChartIndicatorDelete ( 0 , 0 , "ZigZag(" +( string )Inp_ZZ_Depth+ "," +( string )Inp_ZZ_Deviation+ "," +( string )Inp_ZZ_Backstep+ ")" );

Örtülü tip döküm hakkında uyarı. katı (katı) yürütme için, örtük bir döküm bir uyarı verir.

Tipleri açıkça belirtmek gerekir. Ve MT5'te her zaman katı uygulama vardır. MT4'te, #property strict özelliklerini seçebilir ve belirtemezsiniz

 
SanAlex :

Ben kendim öğrendim - ve kendim mevcut kodlardan kopyalıyorum, - Sorun şu ki nasıl heykel yaptığımı açıklayamıyorum!? - içindeki bir şey sana nasıl kör olunacağını söyler.

----------------------------------

Neyi kör ettiğimi biliyorum, orada yeterli değil, hat için başka bir Trol.

Trol eklendi

 input string    t0= "---- Trailing Line:      -----" ;               //
input ushort    InpObjTrailingStop           = 0 ;                 // Obj: Trailing Stop (distance from price to object, in pips)
input ushort    InpObjTrailingStep           = 0 ;                 // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string    t1= "---- Line Name           -----" ;               //
input string    InpObjUpName                 = "Имя Линии Up" ;     // Obj: Up (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InpTradeCommand    = UpName_s;           // Obj:  command: UP
input string    InpObjDownName               = "Имя Линии Down" ;   // Obj: Down (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InTradeCommand     = DownName_b;         // Obj:  command: DOWN
input ushort    InpObjStep                   = 15 ;                 // Obj: Step (distance from price to object, in pips)
Dosyalar:
0006.mq5  109 kb
 
Valeriy Yastremskiy :

Örtülü tip döküm hakkında uyarı. katı (katı) yürütme için, örtük bir döküm bir uyarı verir.

Tipleri açıkça belirtmek gerekir. Ve MT5'te her zaman katı uygulama vardır. MT4'te, özelliklerde #property strict öğesini seçebilir ve belirtemezsiniz

Haklısın Valery! Bu formda, her şey olması gerektiği gibi çalışır. EA başlatma bloğundaki son sürüm:

 //--- create handle of the indicator iCustom
   handle_iCustom= iCustom (m_symbol.Name(), Period (), "Examples\\ZigzagColor" ,
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd ( ChartID (), 0 ,handle_iCustom);

EA başlatma engelleme bloğunda:

 ChartIndicatorDelete ( 0 , 0 , "ZigZag(" +( string )Inp_ZZ_Depth+ "," +( string )Inp_ZZ_Deviation+ "," +( string )Inp_ZZ_Backstep+ ")" );

Bahşiş için teşekkürler!

Saygılarımla, Vladimir.

 
Роман Жилин :

Oooh, çok teşekkür ederim, bu kadar çok bilgi ile çok şey yapabilirsiniz ...

Bir iş gezisine çıkıyorum , bana verilen malzemeleri araştırmak sanırım daha zor ama kodlamaya ne dersiniz... Kağıtta mümkün, güzel bir antrenman olur diye düşünüyorum...


Saygılarımla, Roman

Herkese iyi günler!

Roman bir iş gezisindeyken ve bu konuya katılmazken onun yerine MQL5 programlama dili hakkında sorular sormaya devam edeceğim. CodeBase'de Maksimum Sermaye Riski Yüzdesi kitaplığını https://www.mql5.com/en/code/2142 adresinde buldum. Alış ve satış için pozisyon açmak için basit bir Uzman Danışman kodunu denemeye karar verdim, ancak sabit bir lotla değil, maksimum sermaye riski yüzdesiyle.

İşte kaynak kod (ana göreve konsantre olmak için gereksiz olan her şey kaldırıldı):

 //+------------------------------------------------------------------+
//|                                                  11111111111.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"

input int       TakeProfit= 300 ; //Тейк-профит
input int       StopLoss= 250 ;   //Стоп-лосс
input double    lot= 0.1 ;         //Лот

double Ask;
double Bid;
//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong( double volume= 0.1 ,
             int slippage= 10 ,
             string comment= "Long" ,
             int magic= 0 )
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory (my_trade);
   my_trade.action= TRADE_ACTION_DEAL ;
   my_trade.symbol= Symbol ();
   my_trade.volume= NormalizeDouble (volume, 1 );
   my_trade.price= NormalizeDouble (Ask, _Digits );
   my_trade.sl= NormalizeDouble (Ask-StopLoss* _Point , _Digits );
   my_trade.tp= NormalizeDouble (Ask+TakeProfit* _Point , _Digits );
   my_trade.deviation=slippage;
   my_trade.type= ORDER_TYPE_BUY ;
   my_trade.type_filling= ORDER_FILLING_FOK ;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError ();

   if ( OrderSend (my_trade,my_trade_result))
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
     }
   else
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
       Print ( "Ошибка открытия ордера = " , GetLastError ());
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick ()
  {
.   double Open[];
.
.
         if (Open[ 1 ]>(Open[ 2 ]))
           {
            OpenShort(lot, 10 , "Short" , 1234 );
             return ;
           }
         if ((Open[ 1 ]<Open[ 2 ])
           {
            OpenLong(lot, 10 , "Long" , 1234 );
            cantrade= false ;
             return ;
           }
        }
     }
   return ;
  }
//+------------------------------------------------------------------+

kodu belirtilen kitaplıktan içine ekledi. Sonuç bu koddur:

 //+------------------------------------------------------------------+
//|                                                  11111111111.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"

#include <Trade\SymbolInfo.mqh> // добавлено из библиотеки

input int       TakeProfit= 300 ; //Тейк-профит
input int       StopLoss= 250 ;   //Стоп-лосс
input double    lot= 0.1 ;         //Лот
input double    MaximumPercentageRisk= 25 ; //Риск - добавлено из библиотеки

bool UseMaximumPercentageRisk= true ; // добавлено из библиотеки
double Ask;
double Bid;
//--- этот блок добавлен из библиотеки
//+------------------------------------------------------------------+
//|  GetLotSize RPTrade                                              |
//+------------------------------------------------------------------+
double GetLotSize( double lotsize)
  {
//--- Gets pair specs  
   CSymbolInfo symInfo;
   int   digits_bn=symInfo. Digits ();
   double   points_bn=symInfo. Point ();
   string symbol_bn= _Symbol ;
//--- adjust lot 
   int tmpdecimal= 1 ;
   double old_lot=lotsize;
//---
   if (( NormalizeDouble ( AccountInfoDouble ( ACCOUNT_FREEMARGIN )*(MaximumPercentageRisk/ 100 )/ 1000.0 ,tmpdecimal)<lotsize) 
   && UseMaximumPercentageRisk) //лот подходит под риск ?
     {
      lotsize= NormalizeDouble ( AccountInfoDouble ( ACCOUNT_FREEMARGIN )
      *(MaximumPercentageRisk/ 100 )/ 1000.0 ,tmpdecimal);   //расчет нового размера лота 

       if (lotsize< SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_MIN )) //размер лота подходит под минимльный размер лота брокера ?
        {
         lotsize= SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_MIN ); //Нет! Настройка размера лота под минимальный размер лота брокера
         Print ( _Symbol , " Lot adjusted from " ,old_lot, " для уменьшения размера разрешенного сервером " ,lotsize);
        }
       else
        {
         Print ( _Symbol , " Lot adjusted from " ,old_lot,
         " to " ,lotsize, " для соответствия условию максимального риска. В каждой сделке рисковать можно только " ,
         MaximumPercentageRisk, "% от свободной маржи." );   //Да! 
         if ( MathAbs (lotsize/ SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP )
         - MathRound (lotsize/ SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP )))> 1.0 E- 10 ) //Размер лота подходит под разрешенный шаг брокера ?
           {
            lotsize= SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP )
            * NormalizeDouble (lotsize/ SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP ), 0 );   //НЕТ! Перерасчет размера лота.    
             Print ( "M-" , _Symbol , " Warning: Your calculated percentage at risk lot size of was not a multiple of minimal step" ,
             SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP ), ". Размер лота изменился до" ,lotsize);
           }
        }
     }
   return (lotsize);
 }

//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong( double volume= 0.1 ,
             int slippage= 10 ,
             string comment= "Long" ,
             int magic= 0 )
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory (my_trade);
   my_trade.action= TRADE_ACTION_DEAL ;
   my_trade.symbol= Symbol ();
   my_trade.volume= NormalizeDouble (volume, 1 );
   my_trade.price= NormalizeDouble (Ask, _Digits );
   my_trade.sl= NormalizeDouble (Ask-StopLoss* _Point , _Digits );
   my_trade.tp= NormalizeDouble (Ask+TakeProfit* _Point , _Digits );
   my_trade.deviation=slippage;
   my_trade.type= ORDER_TYPE_BUY ;
   my_trade.type_filling= ORDER_FILLING_FOK ;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError ();

   if ( OrderSend (my_trade,my_trade_result))
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
     }
   else
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
       Print ( "Ошибка открытия ордера = " , GetLastError ());
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick ()
  {
.   double Open[];
.
.
         if (Open[ 1 ]>(Open[ 2 ]))
           {
            OpenShort(lot, 10 , "Short" , 1234 );
             return ;
           }
         if ((Open[ 1 ]<Open[ 2 ])
           {
            OpenLong(lot, 10 , "Long" , 1234 );
            cantrade= false ;
             return ;
           }
        }
     }
   return ;
  }
//+------------------------------------------------------------------+

Ancak danışman hem sabit bir parti üzerinde çalıştı hem de çalışmaya devam ediyor, yani. riski dikkate alınmaz. Söyle bana, lütfen, sermaye riskinin yüzdesini kazanmak için ne yapılması gerekiyor.

Saygılarımla, Vladimir.

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
Beyler, konunun tamamı, tartışma bir sayfa, geri kalan her şey kodlar. Belki sadece kodları girmek yeterlidir?
 
MrBrooklin :

Herkese iyi günler!

Roman bir iş gezisindeyken ve bu konuya aktif olarak katılmazken onun yerine MQL5 programlama dili hakkında sorular sormaya devam edeceğim. CodeBase'de Maksimum Sermaye Riski Yüzdesi kitaplığını https://www.mql5.com/en/code/2142 adresinde buldum. Alış ve satış pozisyonlarının açılmasını, ancak sabit bir lotla değil, maksimum sermaye riski yüzdesiyle uygulamak için basit bir Uzman Danışman kodunu denemeye karar verdim.

İşte kaynak kod (ana göreve konsantre olmak için gereksiz olan her şey kaldırıldı):

kodu belirtilen kitaplıktan içine ekledi. Sonuç bu koddur:

Ancak danışman hem sabit bir parti üzerinde çalıştı hem de çalışmaya devam ediyor, yani. riski dikkate alınmaz. Söyle bana, lütfen, sermaye riskinin yüzdesini kazanmak için ne yapılması gerektiğini.

Saygılarımla, Vladimir.

Yazıldığı gibi, işe yarıyor. Lot==0 ise bir satıra ihtiyacımız var, o zaman riskli lotu düşünüyoruz ve sonunda hesaplamanın değerini Lot değişkenine atıyoruz.

Dördünde, ek bir Lts değişkeni aracılığıyla böyle bir seçenek var.

 bool CheckMoneyForTrade()
 {
 RefreshRates();                               // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);         // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED); // Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0 )                                 // Если заданы лоты,то 
      Lts =Lots;                                 // с ними и работаем 
   else                                          // % свободных средств
      Lts= MathFloor (Free*Prots/One_Lot/Step)*Step; // Для открытия
 
   if (Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                       // Лот дороже свободн.
     {
       Alert ( " Not enough money for " , Lts, " lots" );
     Work= false ;
       return ( false ) ;                                   // Выход из функции()
     }
     return ( true );
     }
 
VVT :
Beyler, konunun tamamı, tartışma bir sayfa, geri kalan her şey kodlar. Belki sadece kodları girmek yeterlidir?

O zaman nasıl yardım edilir?

 
SanAlex :

O zaman nasıl yardım edilir?

Yalnızca sorulanı ekle

 
Valeriy Yastremskiy :

Yazıldığı gibi, işe yarıyor. Lot==0 ise bir satıra ihtiyacımız var, o zaman riskli lotu düşünüyoruz ve sonunda hesaplamanın değerini Lot değişkenine atıyoruz.

Dördünde, ek bir Lts değişkeni aracılığıyla böyle bir seçenek var.

Teşekkürler Valery, bu gece deneyeceğim!

Saygılarımla, Vladimir.