MT5, tüccarlar için değil, programcılar için bir terminaldir - sayfa 17

 
Andrey F. Zelinsky :

Bir programcının C öğrenmeden önce makine komutlarını, montajcıyı, Fortran, PL/1, Pascal'ı ve çok daha fazlasını - ve bunların hepsini ders kitapları olmadan, doğru açıklama olmadan, Volchansky'nin yukarıda söylediği gibi, çarpık harflerle yazdırdığı günler çoktan geride kaldı. belgeler.

Şimdi, yerleşik bir uygulama programlama dilinin bulunduğu karmaşık çok işlevli uygulama sistemlerinin zamanıdır ve bu dilin görevi, uygulama terminalini, programlama ormanına derinlemesine girmeden - hızlı bir şekilde erişebilen uygulama kullanıcıları için erişilebilir kılmaktır. ve kısa sürede ustalaşın ve bu terminal dilini kullanın.


Kabul ediyorum! Doğru ifade edilmiş. Ticaret terminali , ticareti kolaylaştırmalıdır.

 
ILNUR777 :
Yargıladığınız kişi bu. Şirketin yüzü olarak, trollere kaymanız hoş değil. Daha önce MT4 tecrübesi olanların bile zorluk yaşadığı söylendi. Ve Lego'ya ihtiyaçları yok.

Trolleme gördünüz mü?

Stratejiniz için bir test danışmanının basit ve kolay yazılması için birçok fırsat olduğunu zaten birçok kez yazdım.

Ve hatta yardım etmek için bir bağlantı verdi. Şimdi, burada bu sertifika hakkında sorular sormaya başlasalar, en azından böyle bir bilgiye olan ilgi görünür olurdu. Ama her şeyin ne kadar kötü olduğu hakkında devam etti.

O yüzden diyorum ki - muhtemelen şu anki nesil - 18 yaşında, aile bireyleri el arabası almak zorunda, 21 yaşında - hadi bir kulübe alalım. Ve çalışmak için - hayır, neden?

 
Mickey Moose :

assembler ne kadar karmaşık? işlevlerine ihtiyacım var

Ne için. µl5 üzerine yazın. Kolay ve basit.
 
Artyom Trishkin :

Çünkü sadece 10 yıl önce, forumda yeni gelenler, ah, bu tür soruların nasıl olmadığını sordular - bir büyüklük sırası daha zor ve ilginç.

Bu arada, MQL4'teki mevcut sorular, MQL5'teki sorulardan çok daha anlamlı. Nedeni açıktır ve MQL sürümlerinin yaşı değildir.

 
Alexey Viktorov :

Hayır bilmiyorum. Neden bahsediyorsun?

Ancak Alexey, şimdi bir örnek vermeyeceğim. Ancak denemeyi seviyorsunuz - sürün ve farklı girdi verileriyle ne döndürdüğünü görün.

Şimdi hatırlamak ve aramak benim için zor.

Eh, fxsaber bir örnek verdi (kendim için değiştirdim), kodla karşılaştırın:

 //+------------------------------------------------------------------+
//| Возвращает смещение бара таймфрейма по времени                   |
//+------------------------------------------------------------------+
int CTimes::BarShift( const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) const
  {
   int res= WRONG_VALUE ;
   datetime last_bar;
   if (:: SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE ,last_bar)){
       if (time>last_bar) res= 0 ;
       else {
         const int shift=:: Bars (symbol_name,timeframe,time,last_bar);
         if (shift> 0 ) res=shift- 1 ;
         }
      }
   return (res);
  }
//+------------------------------------------------------------------+

Burada Bars()'ın hangi koşullar altında kötü döndüğünü görebilirsiniz.

 
fxsaber :

Bir aceminin yazdığı ilk şey bir ticaret senaryosudur. İkincisi en basit göstergedir. Üçüncüsü basit bir danışmandır.

MQL4'teki ilk aşama bile, yeni başlayanlar tarafından MQL5'ten çok daha hızlı aşılır.

Ticaret scripti??? Neden bir uzman ya da Standart Kitaplığın yerine geçecek biri olmasın?

Benim düşünceme göre, bir ticaret senaryosu yazmak, bariz bir Orta Düzey görevdir ve yeni başlayanlar için hiçbir şekilde uygun değildir.

Yeni başlayan biri, önce kendisini dizelerin en basit çıktısıyla sınırlamalıdır. Sonra - en basit gösterge. Ve ancak o zaman - göstergelerin ve ticaret işlevlerinin talebine devam edin.

 
Mickey Moose :

assembler ne kadar karmaşık? işlevlerine ihtiyacım var

Tam olarak ne?

Assembler, doğrudan böyle "İşlevlerine ihtiyacım vardı" demek için çok spesifik.

 

Güvenlik Konseyi'nin foruma yeni gelenlere sattığı ve tembel insanlardan uzakta bile neden gerçekten zor olduğu konusunda yeni bir örnek. Bugün çok yapıcı bir MQL5 sorusu sızlanmadan soruldu

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

damirka , 2018.01.09 12:14

Merhaba! https://www.mql5.com/ru/articles/100 adresinden MQL5 öğrenmeye başladım. Kodu çalıştırdım, 4756 hatası aldım, belgelere baktım - daha kolay olmadı. Tamam, basit bir taneyle başlamayı düşündüm (Uyarı/Yazdır...). En önemli işlevlerden biri OrderSend'dir. OrderSend'in nasıl kullanılacağına ilişkin forum\belgeleri aramaya başladım. Satın alma pozisyonu açmak için bir kod gördüğüm https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions bu makaleye rastladım. 4756 hatası alındı ve 10030 retcode kodu alındı. 10030 - bunun OrderSend özelliği olduğunu fark ettim, ancak bu özelliğin nasıl kullanılacağını anlamadım (başka birinin koduna baktım) ve en önemlisi ne için olduğunu. Sonra https://www.mql5.com/ru/docs/trading/ordersend dosyasını açtım, kodu kopyaladım, çalıştırdım, her şey yolundaydı, çalıştı.
Ancak 4756 hatasının neden ortaya çıktığını ve 10030'un yanı sıra ondan nasıl kurtulacağını hala anlamıyorum.

Aradaki koda baktım

 void OnTick (){
       //--- объявление и инициализация запроса и результата
       MqlTradeRequest request={ 0 };
       MqlTradeResult   result={ 0 };
       //--- параметры запроса
      request.action   = TRADE_ACTION_DEAL ;                     // тип торговой операции
      request.symbol   = Symbol ();                               // символ
      request.volume   = 0.1 ;                                   // объем в 0.1 лот
      request.type     = ORDER_TYPE_BUY ;                         // тип ордера
      request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_ASK ); // цена для открытия
      request.deviation= 5 ;                                     // допустимое отклонение от цены
      request.magic    =EXPERT_MAGIC;                           // MagicNumber ордера
       //--- отправка запроса
       if (! OrderSend (request,result))
         PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки
         Alert ( GetLastError ());
       //--- информация об операции
       PrintFormat ( "retcode=%u  deal=%I64u  order=%I64u" ,result.retcode,result.deal,result.order);
   }

ve bu

 uint SendRandomPendingOrder( long const magic_number) 
  { 
//--- готовим запрос 
   MqlTradeRequest request={ 0 }; 
   request.action= TRADE_ACTION_PENDING ;         // установка отложенного ордера 
   request.magic=magic_number;                   // ORDER_MAGIC 
   request.symbol= _Symbol ;                       // инструмент 
   request.volume= 0.1 ;                           // объем в 0.1 лот 
   request.sl= 0 ;                                 // Stop Loss не указан 
   request.tp= 0 ;                                 // Take Profit не указан    
//--- сформируем тип ордера 
   request.type=GetRandomType();                 // тип ордера 
//---сформируем цену для отложенного ордера 
   request.price=GetRandomPrice(request.type);   // цена для открытия 
//--- отправим торговый приказ 
   MqlTradeResult result={ 0 }; 
   OrderSend (request,result); 
//--- выведем в лог ответ сервера   
   Print ( __FUNCTION__ , ":" ,result.comment); 
   if (result.retcode== 10016 ) Print (result.bid,result.ask,result.price); 
//--- вернем код ответа торгового сервера 
   return result.retcode; 
  } 

Bence neredeyse aynılar, bu hataların ortaya çıktığı yerleri göremiyorum (4756 ve 10030). Parmağınızı gösterin ve açıklayın lütfen


moderatör yanıtı

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

Vladimir Karputov , 2018.01.09 12:20


CTrade ticaret sınıfını kullanın - bu şekilde minimum hata yapmanız garanti edilir.

Bir Alım açmak için bir takas talebi gönderme örneği:


Muhtemelen çözmeme yardım etti. Ama aslında, yeni başlayanların sorunu çok da yeni başlayanların sorunu değil.

Onlar. Gidip belirtilen konudaki bağlantıları okumalısınız. Güvenlik Konseyi'nde bu harika bir yerden çözülüyor. Onlar. En basit ticaret senaryosunu yazarken (yeni başlayanlar için ilk program), neredeyse çocuk oyuncağı.

 
George Merts :

Ticaret scripti??? Neden bir uzman ya da Standart Kitaplığın yerine geçecek biri olmasın?

Benim düşünceme göre, bir ticaret senaryosu yazmak, bariz bir Orta Düzey görevdir ve yeni başlayanlar için hiçbir şekilde uygun değildir.

Yeni başlayan biri, önce kendisini dizelerin en basit çıktısıyla sınırlamalıdır. Sonra - en basit gösterge. Ve ancak o zaman - göstergelerin ve ticaret işlevlerinin talebine devam edin.

Hemen çok para birimli bir MTF Uzman Danışmanı ile başladım. Ve yeni başlayanlar için yardım dalında oldukça iyi hissettim. Evet ve çok fazla soru sormadım - yardım var ve beyin bir yerde ...

 

Bu arada, iBarsShift hakkında.

İşte benim analog fonksiyonum (CTSTime bir sınıf-zaman serisidir), yeni başlayanlar için yorumlarla bile biraz karmaşık olduğunu düşünüyorum. Yani SB'de gerçekten eksik:

 // Функция ищет бар, внутри которого находится указанный момент.
// Если такой бар найден - возвращается true и ссылка rIdx устанавливает нужное значение 
// Если такой бар не найден - возвращается false и ссылка rIdx устанавливает значение на ближайший индекс,
// время которого меньше, требуемого.
// При недостаточности буффера функция возвращает false, ссылка устанавливается на отрицательное значение.   
// NOTE !!! ненаступивший момент может лежать внутри нулевого бара, в этом случае вернется true,
// даже если фактически данный момент еще не наступил. false вернется только если данный момент лежит позже
// нулевого бара. 
// Если искомый момент находится раньше самого раннего бара, возвращается false и  rIdx = INT_MAX

bool CTSTime::FindIdxOf( datetime dtMomentToFind, int & rIdx)
{
   ASSERT(dtMomentToFind > MIN_DATETIME && dtMomentToFind < NEVER_EXPIRES);

   // Пока найденный индекс - невалиден.
   rIdx = WRONG_VALUE ;

   // Если данных нет - возвращаем отрицательный результат поиска.
   if (GetTSSize() == 0 )
       return ( false );

   // Найдем продолжительность текущего бара
   int iSecondsInBar = PeriodSeconds (m_etTimeframe);
   
   ASSERT(iSecondsInBar >= SECS_IN_MINUTE);

   datetime dtMomentOfZeroBar = GetTime( 0 );
   datetime dtMomentOfLastBar = GetTime(GetTSSize()- 1 );
   
   // Искомый момент лежит внутри или позже, чем нулевой бар ?  
   if (dtMomentToFind >= dtMomentOfZeroBar)   
      {
      rIdx = 0 ;
      
       // Искомый момент лежит на открытии минус первого бара или позже ?  
       if (dtMomentToFind >= dtMomentOfZeroBar + iSecondsInBar) 
         return ( false );   // Искомый момент лежит после нулевого бара. 
      
       // Искомый момент лежит внутри нулевого бара.
       return ( true );               
      };
      
   // Здесь ясно, что искомый момент был ранее нулевого бара. 
   
   // Проверим, может быть искомый момент лежит раньше последнего бара ? 
   if (dtMomentToFind < dtMomentOfLastBar)
      {
       // Увы, такого раннего момента в таймсерии нет. 
       // Возвращаем самый большой индекс бара, какой можем возвратить
       // (Потому, что бара со временем меньше требуемого - в таймсерии нет).
      rIdx = INT_MAX ;
       return ( false );
      };

   // Здесь ясно, что искомый момент был позже начала самого раннего бара, но раньше начала самого нового бара.

   ASSERT(GetTSSize()  > 1 );   // Проверим, размер буффера должен быть минимум два бара. (Иначе условие не выполняется, что искомый момент был позже начала самого раннего бара, но раньше начала самого нового бара, не выполняется)

   // Ищем примерно, где был данный момент.
   ASSERT(dtMomentOfZeroBar > dtMomentToFind);
   ASSERT(dtMomentOfZeroBar > dtMomentOfLastBar);
   
   ulong ulSecFromSearchToLatest = dtMomentOfZeroBar - dtMomentToFind;   
   ulong ulSecFromEarlestToLatest = dtMomentOfZeroBar - dtMomentOfLastBar;
   
   ASSERT(ulSecFromEarlestToLatest > ulSecFromSearchToLatest);
    
   double dResIdx = ( double )ulSecFromSearchToLatest*( double )(GetTSSize()- 1 )/( double )ulSecFromEarlestToLatest;
   
   ASSERT(dResIdx < INT_MAX && dResIdx >= 0 );
   
   int iResIdx = ( int ) MathRound (dResIdx);
   
   ASSERT(iResIdx >= 0 && iResIdx<( int )GetTSSize());   // По идее, мы должны уложиться в этот диапазон.
   
   // Поскольку мы исследуем минимум два бара (текущий и следующий),
   // Текущий бар не должен быть нулевым.
   // Поскольку случай с буффером в один бар у нас был отсеян раньше, мы не должны получить ошибку.
   
   if (iResIdx == 0 )  
      iResIdx = 1 ;

   // Получен приблизительный индекс (uiResIdx).
   
   // Уточняем. Берем два бара, текущий и следующий.
   datetime dtResMoment;
   datetime dtNextMoment;
   
   
   dtResMoment = GetTime(iResIdx);
   dtNextMoment = GetTime(iResIdx- 1 );
   
   int iShift = 0 ;
   bool bUp = false ;
   bool bDown = false ;
   
   do
      {
       if (dtResMoment > dtMomentToFind)       // Если искомый момент раньше начала первого бара
         {
         iShift = 1 ;                         // Возьмем на один бар раньше.
         bUp = true ;                         // Запомним направление
         }
       else                                    // Иначе - Искомый момент равен или позже начала первого бара. 
         {
         if (dtNextMoment <= dtMomentToFind)   // Если искомый момент больше или равен началу второго бара
            {
            iShift = - 1 ;                     // Возьмем на один бар позже
            bDown = true ;                     // Запомним направление
            }
         else                            // Иначе - искомый момент равен или позже начала перого бара и раньше начала  второго бара   
            {         
            iShift = 0 ;                 // То есть, можно выходить из цикла коррекции.
            }
         }  

      iResIdx += iShift;               // Смещаемся

       if (iResIdx > ( int )GetTSSize() || iResIdx <= 0 ) // Проверим на допустимый диапазон
         {
         ASSERT( false );     // В серии недостаточно данных (мал буффер)
         rIdx = INT_MAX ;
         return ( false );
         };
                  
      dtResMoment = GetTime(iResIdx);   // Запрашиваем новые данные 
      dtNextMoment = GetTime(iResIdx- 1 );
            
       if (bUp == true && bDown == true ) // Контроль направления коррекции
         {
         ASSERT( false );                 // Сменилось направление коррекции !!!
         iShift = 0 ;
         }           
      }
   while (iShift != 0 );
   
   // В этой точке искомый момент равен или позже начала перого бара и раньше начала  второго бара.
   // Проверим, может быть, искомый момент позже конца первого бара, но раньше начала второго бара 
   // (между барами разрыв, и искомый момент находится именно там)
   
   // Ясно, что ссылка должна показывать на первый бар в любом случае 
   
   rIdx = iResIdx;
   
   if (dtMomentToFind >= dtResMoment+iSecondsInBar)
       // Действительно, искомый момент - внутри разрыва между барами.
       return ( false );
   
   return ( true );         
};