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

 

En ufak bir google'a girip okumaya hevesim yok o yüzden D:\1.txt dosyasını açtım

 /*
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew
HINSTANCE ShellExecuteW(
  HWND    hwnd,
  LPCWSTR lpOperation,
  LPCWSTR lpFile,
  LPCWSTR lpParameters,
  LPCWSTR lpDirectory,
  INT     nShowCmd
);
*/
#import "shell32.dll"
int ShellExecuteW( int hWnd, string lpVerb, string lpFile, string lpParameters, string lpDirectory, int nCmdShow);
#import
#define SW_SHOW 5
#define SW_SHOWNORMAL 1
//+------------------------------------------------------------------+
void OnStart ()
{
   ShellExecuteW( NULL , "Open" , "notepad.exe" , "D:\\1.txt" , NULL ,SW_SHOW); 
}
//+------------------------------------------------------------------+
 

göstergede bunu yapmanın en iyi yolu nedir, zamanlayıcıyı 1sn başlatın veya OnCalculate'de zamanı (saniye) karşılaştırın

<1sn, çıkış

Yoksa başka çalışma seçenekleri var mı?

bir ay boyunca HistorySelect'i güncellemeniz gerekiyor + nesnelerle çalışın

 
Fast235 :

veya OnCalculate'de karşılaştırma süresi (saniye)

<1sn, çıkış

bir saniye yeterli olmayacak, nokta tarih saat - bir saniyeden az olamaz

en az milisaniye karşılaştır

 int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const LastOnCalculate = GetTickCount (); &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
   static uint LastOnCalculate = GetTickCount ();
   if ( GetTickCount () - LastOnCalculate < 1000 ) return (rates_total);
   LastOnCalculate = GetTickCount ();
   .........
   return (rates_total);
}
Hızlı235 :

göstergede bunu yapmanın en iyi yolu nedir, zamanlayıcıyı 1sn başlatın veya OnCalculate'de zamanı (saniye) karşılaştırın


bence, nerede yapılacağı önemli değil, tek şey OnCalculate'in kenelere bağlı olması - kene olmayacak, bu yüzden OnCalculate'e çağrı olmayacak

Hızlı235 :

bir ay boyunca HistorySelect'i güncellemeniz gerekiyor + nesnelerle çalışın

GeçmişSeç   hızlı, ancak 1000 + altındaki nesneler varsa, nesneleri taşımak veya gecikmeler oluşturmak için buraya gelin

ve bu nesneleri her saniye değiştireceksiniz


genel olarak, kod yazın, tuzaklar yol boyunca hemen ortaya çıkacaktır)))

 

bir saniye benim için yeterli ve kene gelene kadar daha az sıklıkta

grafikte esnafı + çubuklar üzerindeki ticaretin sonucunu ve küresel trend gibi bazı yarı statik bilgileri görüntülemek için

fiyat izle değişebilir

 int OnCalculate ( const int rates_total,       // размер массива price[] 
                 const int prev_calculated,   // обработано баров на предыдущем вызове 
                 const int begin,             // откуда начинаются значимые данные 
                 const double & price[]       // массив для расчета 
   );

veya ikinci seçenekten itibaren zaman

 

Lütfen bana söyle!

Mevcut grafik sembolünü ihtiyacım olanla karşılaştırmak nasıl mümkün olabilir?

       case 1 : // кейс для открытия Buy по AUD/USD
               if ( Symbol () == (как обозначить нужный символ для сравнения?))                                     // если символ текущего графика AUD/USD открываем сделку
               {
                  RefreshRates();
                  Open_Order = OrderSend ( "AUDUSD" ,OP_BUY,Lot(),Ask, 0 , 0 , 0 ); // Открытие ордера
//----------------------------------------------------------------------------------------------------
В тоже время советник запущен на другом графике и пытается произвести открытие ордера, цены не совпадают и соответственно вылетает ошибка - неверные цены

       case 2 : // кейс для открытия Bay по GBP/USD 
               if ( Symbol () == (как обозначить нужный символ для сравнения?)) 
// если символ текущего графика не AUDUSD то выходим
               {
                  RefreshRates();
                  Open_Order = OrderSend ( "GBPUSD" ,OP_SELL,Lot(),Bid, 0 , 0 , 0 ); // Открытие ордера

Т.е. надо ему дать понять, что тот или иной кейс принадлежит тому или другому графику, но чтот я пока не придумал как

AUD / USD çifti için bir emir açması gerektiğini anlamam için programa ihtiyacım var ve onu açıyor (bu olması gerektiği gibi çalışıyor), ancak aynı zamanda bu emri diğer açık grafiklerde açmaya çalışıyor (robot EA'nın çalıştığı diğer döviz çiftleri için sırasıyla bir fiyat hatası olarak döndürülen birkaç döviz çiftinde çalışıyor). Bu yüzden bir karşılaştırma yapmam gerekiyor, eğer Symbol() ==, sipariş açmanız gereken sembole eşitse, onu açıyoruz ve değilse, çıkıyoruz. Sembolün adını terminalden ayarlamak ve karşılaştırma yapmak için herhangi bir yerde değişken olarak bir şey almadım.

 
Denis Diakonov :

Lütfen bana söyle!

Mevcut grafik sembolünü ihtiyacım olanla karşılaştırmak nasıl mümkün olabilir?

AUD / USD çifti için bir emir açması gerektiğini anlamam için programa ihtiyacım var ve onu açıyor (bu olması gerektiği gibi çalışıyor), ancak aynı zamanda bu emri diğer açık grafiklerde açmaya çalışıyor (robot EA'nın çalıştığı diğer döviz çiftleri için sırasıyla bir fiyat hatası olarak döndürülen birkaç döviz çiftinde çalışıyor). Bu yüzden bir karşılaştırma yapmam gerekiyor, eğer Symbol() ==, sipariş açmanız gereken sembole eşitse, onu açıyoruz ve değilse, çıkıyoruz. Sembolün adını terminalden ayarlamak ve karşılaştırma yapmak için herhangi bir yerde değişken olarak bir şey almadım.

Doğru fiyatları almanın sonunda bir örnek var.

SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
  • docs.mql4.com
2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром. Если функция используется для получения информации о последнем тике, то лучше использовать SymbolInfoTick(). Вполне возможно, что по данному символу с...
 
Denis Diakonov :

Teşekkürler, ama doğru fiyatlara ihtiyacım yok. Fiyatlarla her şey güzel. Danışmanın, emrin açıldığı döviz çifti robotun bağlı olduğu mevcut açık grafikle eşleşmemesi durumunda emir açmamasına ihtiyacım var. Yeni bir çizelgeyi bir zaman çerçevesi ile açıp, içinde ihtiyacınız olan sırayı açıp bu çizelgeyi kapatarak uygulamak mümkün, hemen deneyeceğim

 string   symbol;
....
int OnInit ()
{...
 symbol= Symbol ();
....
}
void OnTick ()
...
 if (symbol == Symbol ())
{
... //открываем ордер
}
....
 
Valeriy Yastremskiy :
Valeriy Yastremskiy :

hayır, bu şekilde çalışmıyor.

Programım mevcut tabloya erişir, ona mevcut enstrümanın adını atar ve onu bir değişkende mühürler, ardından bu değişkenin değerini tablodaki mevcut sembolle karşılaştırır. Aslında, kendisiyle karşılaştırır))) bir şekilde Sympol ()'i başka herhangi bir değişkeni karşılaştırabileceğiniz herhangi bir değere dönüştürmeniz gerekir. Örneğin:

diziUSDUSD;

( Sembol() == AUDUSD)

sonra param pam pam .. bir şekilde benim için çalıştı, ben mutluyken ve her şeyi olması gerektiği gibi değiştirdim - artık hiçbir şey çalışmıyor))

 
Denis Diakonov :

hayır, bu şekilde çalışmıyor.

Programım mevcut tabloya erişir, ona mevcut enstrümanın adını atar ve onu bir değişkende mühürler, ardından bu değişkenin değerini tablodaki mevcut sembolle karşılaştırır. Aslında, kendisiyle karşılaştırır))) bir şekilde Sympol ()'i başka herhangi bir değişkeni karşılaştırabileceğiniz herhangi bir değere dönüştürmeniz gerekir. Örneğin:

diziUSDUSD;

(Sembol() == AUDUSD)

sonra param pam pam .. bir şekilde benim için çalıştı, ben mutluyken ve her şeyi olması gerektiği gibi değiştirdim - artık hiçbir şey çalışmıyor))

dizi USDUSD = "USDUSD";

En azından öyle.

 
Denis Diakonov :

hayır, bu şekilde çalışmıyor.

Programım mevcut tabloya erişir, ona mevcut enstrümanın adını atar ve onu bir değişkende mühürler, ardından bu değişkenin değerini tablodaki mevcut sembolle karşılaştırır. Aslında, kendisiyle karşılaştırır))) bir şekilde Sympol ()'i başka herhangi bir değişkeni karşılaştırabileceğiniz herhangi bir değere dönüştürmeniz gerekir. Örneğin:

diziUSDUSD;

(Sembol() == AUDUSD)

sonra param pam pam .. bir şekilde benim için çalıştı, ben mutluyken ve her şeyi olması gerektiği gibi değiştirdim - artık hiçbir şey çalışmıyor))

Uzman Danışman, komut dosyası, gösterge geçerli değildir, ancak geçerli pencerede çalışır. Ve farklı pencerelerin/tabloların global değişkenleri örtüşmez. Yani çalışması gerekir)

diziUSDUSD; // Bu bir metin değişkenidir, ayrıca başlangıçta boş yani. eşittir ""

(Symbol() == AUDUSD) // bu satırın AUDUSD değişkeni ile ilgisi yoktur.

 Symbol
Возвращает имя символа текущего графика.
string    Symbol ();
Возвращаемое значение
Значение системной переменной _Symbol , в которой хранится имя символа текущего графика.

Ancak sipariş açma kriterleri farklı enstrümanlar / pencereler için aynı olmamalıdır. Eğer aynılarsa, o zaman gerçekten de tüm pencerelerde açılacaktır.