MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 950

 
Rustam Bikbulatov :

Bu işlev, her siparişte bir sayı, daha doğrusu lot*100 yazar.

Şimdi en son hangi sayının olduğunu gösteren bir ters fonksiyona ihtiyacımız var.

Dene:

 double value = StringToDouble ( ObjectGetString ( 0 ,object_name, OBJPROP_TEXT )); 

Nesne metin içeriyorsa (sayısal değil), StringSubstr() eklemeniz gerekir:

 double value = StringToDouble ( StringSubstr ( ObjectGetString ( 0 ,object_name, OBJPROP_TEXT ),begin_index,length));

start_index - dizedeki karakter dizini, sıfırdan başlayarak, uzunluk - sayısal değerin uzunluğu (sayı kaç karakter kaplar)... bence öyle

 
Yevhenii Levchenko :

Dene:

Nesne metin içeriyorsa (sayısal değil), StringSubstr() eklemeniz gerekir:

start_index - dizedeki karakter dizini, sıfırdan başlayarak, uzunluk - sayısal değerin uzunluğu (sayı kaç karakter kaplar)... bence öyle

Eh, başlangıçta tüm bu sayıları grafikte aramak gerekli olacaktır. Bu yüzden işe yaramayacak. Sorun bu. Zaten kontrol edildi

 
Yevhenii Levchenko :

Dene:

Nesne metin içeriyorsa (sayısal değil), StringSubstr() eklemeniz gerekir:

start_index - dizedeki karakter dizini, sıfırdan başlayarak, uzunluk - sayısal değerin uzunluğu (sayı kaç karakter kaplar)... bence öyle

   bool name;
         for ( int i= 0 ; i< ObjectsTotal ( 0 , "LOTB" +OrderTicket(), OBJ_TEXT ); i++)
     {
      name = ObjectSetString ( 0 , "LOTB" +OrderTicket(), OBJ_TEXT , 0 );
       Comment ( "   " ,name); 
   }

Böyle bir şey yaptım ama işe yaramadı. sıfır gösterir.

 
Rustam Bikbulatov :

Böyle bir şey yaptım ama işe yaramadı. sıfır gösterir.

Değeri ayarlamanız mı yoksa almanız mı gerekiyor? ObjectSetString() işlevi , bir metin değeri ayarlar ve bir bool değeri döndürür . Bu o değil. Ve döngünün başında, bence, doğru biçimlendirilmemiş ... Where ObjectsTotal() ... MT4 referansı tarafından yönlendiriliyorum. Yoksa bir MT5 kodu mu?

 
Yevhenii Levchenko :

Değeri ayarlamanız mı yoksa almanız mı gerekiyor? ObjectSetString() işlevi , bir metin değeri ayarlar ve bir bool değeri döndürür . Bu o değil. Ve döngünün başında, bence, doğru biçimlendirilmemiş ... Where ObjectsTotal() ... MT4 referansı tarafından yönlendiriliyorum. Yoksa bir MT5 kodu mu?

bu MT4

 

Bir kez daha, herkese iyi günler!

Daha önce sorduğum soruya kimse cevap vermedi ama yine de kodu çözmeme yardım etmeni istiyorum.

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

MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma

MrBrooklin , 2019.08.30 14:15

Herkese iyi günler!

İşte Metatrader5 için komut dosyasının bir parçası:

 #property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//---- показывать входные параметры
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                       // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Enum Stop or Limit                                               |
//+------------------------------------------------------------------+
enum ENUM_STOP_OR_LIMIT
  {
   stop= 0 ,     // Buy stop and Sell stop
   limit= 1      // Buy limit and Sell limit
  };
//--- input parameters
input ushort                InpUpGap          = 15 ;     // Gap for pending orders UP from the current price (in points)
input ushort                InpUpStep         = 30 ;     // Step between orders UP (in points)

input ushort                InpDownGap        = 15 ;     // Gap for pending orders DOWN from the current price (in points)
input ushort                InpDownStep       = 30 ;     // Step between orders DOWN (in points)

input ENUM_STOP_OR_LIMIT   InpPending        = stop;   // Type of pending orders

input uchar                 InpUpQuantity     = 1 ;     // UP quantity orders
input uchar                 InpDownQuantity   = 1 ;     // DOWN quantity orders

input double                InpLots           = 0.01 ;   // Lots
input ushort                InpStopLoss       = 50 ;     // Stop Loss (in points)
input ushort                InpTakeProfit     = 50 ;     // Take Profit (in points)
//---
ulong                       m_slippage= 30 ;             // slippage

double                      ExtUpGap= 0.0 ;
double                      ExtUpStep= 0.0 ;

double                      ExtDownGap= 0.0 ;
double                      ExtDownStep= 0.0 ;

double                      ExtStopLoss= 0.0 ;
double                      ExtTakeProfit= 0.0 ;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   if (InpLots<= 0.0 )
     {
       Print ( "The \"Lots\" can't be smaller or equal to zero" );
       return ;
     }
//---
   if (!m_symbol.Name( Symbol ())) // sets symbol name
       return ;
   if (!RefreshRates())
       return ;

   string err_text= "" ;
   if (!CheckVolumeValue(InpLots,err_text))
     {
       Print (err_text);
       return ;
     }

//---
   if (IsFillingTypeAllowed( SYMBOL_FILLING_FOK ))
      m_trade.SetTypeFilling( ORDER_FILLING_FOK );
   else
       if (IsFillingTypeAllowed( SYMBOL_FILLING_IOC ))
         m_trade.SetTypeFilling( ORDER_FILLING_IOC );
       else
         m_trade.SetTypeFilling( ORDER_FILLING_RETURN );

//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode( true );

//---
   ExtUpGap = m_symbol. Point () * InpUpGap;
   ExtUpStep = m_symbol. Point () * InpUpStep;

   ExtDownGap = m_symbol. Point () * InpDownGap;
   ExtDownStep = m_symbol. Point () * InpDownStep;

   ExtStopLoss = m_symbol. Point () * InpStopLoss;
   ExtTakeProfit = m_symbol. Point () * InpTakeProfit;

//--- start work
   double start_price_ask=m_symbol.Ask()-ExtUpGap;
   double start_price_bid=m_symbol.Bid()+ExtDownGap;

//--- set pending orders
   for ( int i= 0 ; i<InpUpQuantity; i++)
     {
       double price_ask = start_price_ask+i*ExtUpStep;
       double price_bid = start_price_bid+i*ExtUpStep;
       if (InpPending==stop)
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyStop(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
       else
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellLimit(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }

   for ( int i= 0 ; i<InpDownQuantity; i++)
     {
       double price_ask = start_price_ask-i*ExtDownStep;
       double price_bid = start_price_bid-i*ExtDownStep;
       if (InpPending==limit)
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_ask - ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
       else
        {
         double sl = (ExtStopLoss== 0.0 )   ? 0.0 : price_bid + ExtStopLoss;
         double tp = (ExtTakeProfit== 0.0 ) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
         m_symbol.NormalizePrice(sl),
         m_symbol.NormalizePrice(tp));
        }
     }
  }

Planlandığı gibi, komut dosyası, talep ve tekliften belirli bir mesafede bekleyen limit emirleri veya durdurma emirleri belirlemelidir. Limit bekleyen emirler sorunsuz bir şekilde belirlenir, ancak durdurma emirleri değildir. Lütfen Buy Stop ve Sell Stop bekleyen emirlerinin neden ayarlanmadığını anlamama yardım edin.

Saygılarımla, Vladimir.

Bundan sonra bir soru daha: Piyasa kapalıyken (örneğin hafta sonları) senaryoyu test etmenin herhangi bir yolu var mı?

Saygılarımla, Vladimir.

 
Artyom Trishkin :

Hangi listeden?

Ve lütfen düzenleyicideki şekillendiriciyi kullanın (Ctrl+<):

Ne nereden alınmalı?

Bana söyler misin?

 
MrBrooklin :

Bir kez daha, herkese iyi günler!

Daha önce sorduğum soruya kimse cevap vermedi ama yine de kodu çözmeme yardım etmeni istiyorum.

Bundan sonra bir soru daha: Piyasa kapalıyken (örneğin hafta sonları) senaryoyu test etmenin herhangi bir yolu var mı?

Saygılarımla, Vladimir.

Hayır, komut dosyası kapalı bir piyasada çalışmaz - sipariş vermez.

Hataları anlamak için kurulum seviyelerini hesapladığınız fiyatın değerini ve işlem emrine gönderdiğiniz tüm fiyat seviyelerinin değerlerini logda yazdırmaya çalışın.

 
Merhaba millet. Açık nizamın yakınına kura yazımı yapıldı.
 for ( int no1= 0 ; no1< OrdersTotal (); no1++)
  {
   if ( OrderSelect (no1,SELECT_BY_POS,MODE_TRADES))
     {
       if (OrderSymbol()== Symbol () && OrderType()== OP_BUY)
        {
         ObjectCreate ( "LOTB" +OrderTicket(), OBJ_TEXT , 0 , TimeCurrent (),OrderOpenPrice());
         ObjectSetText( "LOTB" +OrderTicket(),OrderLots()* 100 , 20 , "Arial" , clrWheat );
         ObjectSetInteger ( 0 , "LOTB" +OrderTicket(), OBJPROP_ANCHOR , ANCHOR_RIGHT_UPPER );
        }
     }
  } 
Bana bu listedeki son metni kodun başka bir bölümünde nasıl alacağımı söyle?
 
Rustam Bikbulatov :

Bana söyler misin?

Açılan son siparişi bulmanız gerekir. Biletini bul. Daha sonra, nesne adları listesinde, nesne adıyla satırda son siparişin bulunan bileti ile bir alt dizinin oluşumunu ararız. Nesne adında son siparişin biletini bulduğunuzda, bu gerekli grafik nesnesidir. Bu grafik nesnesinden ihtiyacınız olanı çıkarmak için kalır.

Neden: