İşte projenin .cpp dosyası , bir bakacağım ve birkaç kez Google ve Yandex'e gideceğim, beynimi bulandıran bir şey bulamadım, genel olarak anlaşılabilir. Hatta basit görünüyor.
Ama nasıl çalışıyor? Bu ddl'ye nasıl erişeceğimi tam olarak anlamadım - EA kodundan? Nasıl? İlk olarak, bu gibi görünüyor #include <GetIntValue> Hayır, bir sorun var ..
2. Bir dll çağırırken, stüdyoyu açık tutmak gerekli değildir, değil mi? nasıl yapılır?
Lütfen aynı dll'ye mql kodundan erişmenin en basit örneğini gösterin.
İşte başka bir soru. Bir treylerim var. 1 tek yönlü sipariş açık olduğunda, her şey harika çalışıyor, eğer daha fazlaysa, o zaman nedense çalışmıyor. Niye ya?
İşte projenin .cpp dosyası, bir bakacağım ve birkaç kez Google ve Yandex'e gideceğim, beynimi bulandıran bir şey bulamadım, genel olarak anlaşılır. Hatta basit görünüyor.
Ama nasıl çalışıyor? Bu ddl'ye nasıl erişeceğimi tam olarak anlamadım - EA kodundan? Nasıl? İlk olarak, bu gibi görünüyor #include <GetIntValue> Hayır, bir sorun var ..
Yaklaşık olarak bu şekilde. Çalıştırmak için DLL'yi derlemeniz ve bunu uzmanlar/kütüphaneler klasörüne koymanız gerekir (yardımı ve öğreticiyi okuyun, orada her şey ayrıntılı olarak açıklanmıştır).
//сначала надо объявить импорт функции из DLL#import "имя_вашей_длл.dll"int SortStringArray( string *arr[], constint arraysize);
#import
//в тексте программы вызов проще простогоstring arr[];
int size;
...
//где-то в коде массив заполняется
...
//а вот и вызов сортировки
SortStringArray(arr,size);
2. Bir dll çağırırken, stüdyoyu açık tutmak gerekli değildir, değil mi? nasıl yapılır?
Dll, basitçe söylemek gerekirse, içinde uygulanan işlevlerin kullanıcı tarafından değil, başka bir program tarafından çağrılması dışında, sıradan bir Windows programıdır. Bunu mümkün kılmak için, C++ dil derleyicisine __declspec(dllexport) değiştiricisini belirtiyoruz.
İşte başka bir soru. Bir treylerim var. 1 tek yönlü sipariş açık olduğunda, her şey harika çalışıyor, eğer daha fazlaysa, o zaman nedense çalışmıyor. Niye ya?
fonksiyona parametre iletmek gerektiğinden, bunu deneyin
bool IfProfTrail=yanlış; // Yalnızca karlı pozisyonlar için kullanın - başabaş modu int TrailingStop=0; // Takip mesafesi = 0 - izin verilen minimum int TrailingStep=1; // mesafe adımı
void Trailing( string sy= "" , int op=- 1 , int mn=- 1 )
{
double po,pp;
int i,k= OrdersTotal ();
if (sy== "0" ) sy= Symbol ();
if (TrailingStop== 0 )TrailingStop=MarketInfo( Symbol (),MODE_STOPLEVEL);
for (i= 0 ;i<k;i++)
{
if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
{
if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op))
{
po=MarketInfo(OrderSymbol(),MODE_POINT);
if (mn< 0 || OrderMagicNumber()==mn)
{
if (OrderType()==OP_BUY)
{
pp=MarketInfo(OrderSymbol(),MODE_BID);
if ((!IfProfTrail && OrderProfit()> 0 ) || pp-OrderOpenPrice()>TrailingStop*po)
{
if (OrderStopLoss()<pp-(TrailingStop+TrailingStep- 1 )*po)
{
ModifyOrder(- 1 ,pp-TrailingStop*po,- 1 );
}
}
}
if (OrderType()==OP_SELL)
{
pp=MarketInfo(OrderSymbol(),MODE_ASK);
if ((!IfProfTrail && OrderProfit()> 0 ) || OrderOpenPrice()-pp>TrailingStop*po)
{
if (OrderStopLoss()>pp+(TrailingStop+TrailingStep- 1 )*po || OrderStopLoss()== 0 )
{
ModifyOrder(- 1 ,pp+TrailingStop*po,- 1 );
}
}
}
}
}
}
}
}
Bildiğim kadarıyla, satın alma işlemi sor ile yapılıyor ve iClose(Symbol(),Period(),0) fiyatları tekliften alıyor. Sonuç olarak, hata oluşması muhtemeldir.
Şimdi aşağıdaki kombinasyonu kullanıyorum:
Ancak, soru hemen ortaya çıkıyor, çünkü danışman bir pip değil, fiyat uzun süredir satın alma bölgesindeydi ve her tik ile güncellendi.
Anlaşma neden açılmıyor? Danışmanın bir hata üzerine donduğu ve başka bir fiyat değişikliği görmediği ortaya çıktı?
Sizce bu EA'daki hata işleme işlevine 129 ve 138 hataları için bir kontrol eklemeye değer mi?
Evet ise, o zaman nasıl yapılır?
En azından, tüm hataları ele alan pozisyonları açmak/emirleri ayarlamak için kendi işlevinize sahip olmalısınız. İçinde en son fiyatları almanız gerekiyor.
Herhangi bir yapıya bakmadım. Ancak şunu söyleyeceğim: Expert Advisor'da sunucu tarafından döndürülen tüm hataları işlemeniz gerekir. Ve bu yeterli değil. Öngörülemeyen herhangi bir durumda, işlevsellik kaybı olmadan ve algoritması bozulmadan pozisyonlarını alabilmeli ve olağanüstü bir şey olmamış gibi çalışmalarına devam edebilmelidir.
derleyin ve uzmanlar/kütüphaneler klasörüne koyun Teşekkürler!!! Şimdi deneyeceğim. Ve eskiden tanışıyordum ama şimdi konuyla ilgili bu kadar ayrıntılı ve sindirilebilir bir şey bulamıyorum.
En azından, tüm hataları ele alan pozisyonları açmak/emirleri ayarlamak için kendi işlevinize sahip olmalısınız. İçinde en son fiyatları almanız gerekiyor.
Herhangi bir yapıya bakmadım. Ancak şunu söyleyeceğim: Expert Advisor'da sunucu tarafından döndürülen tüm hataları işlemeniz gerekir. Ve bu yeterli değil. Öngörülemeyen herhangi bir durumda, işlevsellik kaybı olmadan ve algoritması bozulmadan pozisyonlarını alabilmeli ve olağanüstü bir şey olmamış gibi çalışmalarına devam edebilmelidir.
Şablon ders kitabından alınmıştır. Şu anda hata işleme işlevlerinde özellikle güçlü değil.
Emirlerin açılışında RefreshRates() vardır; (dedikleri gibi, teklifler ve talepler piyasa bilgileri aracılığıyla değiştirilir)
while ( true ) // Цикл закрытия орд.
{
if (Total== 0 && Opn_B== true ) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
SL=Bid - New_Stop(StopLoss)* Point ; // Вычисление SL откр.
TP=Bid + New_Stop(TakeProfit)* Point ; // Вычисление TP откр.Alert ( "Попытка открыть Buy. Ожидание ответа.." );
Ticket= OrderSend (Symb,OP_BUY,Lts,Ask, 2 ,SL,TP); //Открытие Buyif (Ticket > 0 ) // Получилось :)
{
Alert ( "Открыт ордер Buy " ,Ticket);
return ; // Выход из start()
}
if (Fun_Error( GetLastError ())== 1 ) // Обработка ошибокcontinue ; // Повторная попыткаreturn ; // Выход из start()
}
Ve hata işleme işlevi:
int Fun_Error( int Error) // Ф-ия обработ ошибок
{
switch (Error)
{ // Преодолимые ошибки case4 : Alert ( "Торговый сервер занят. Пробуем ещё раз.." );
Sleep ( 3000 ); // Простое решениеreturn ( 1 ); // Выход из функцииcase135 : Alert ( "Цена изменилась. Пробуем ещё раз.." );
RefreshRates(); // Обновим данныеreturn ( 1 ); // Выход из функцииcase136 : Alert ( "Нет цен. Ждём новый тик.." );
while (RefreshRates()== false ) // До нового тикаSleep ( 1 ); // Задержка в циклеreturn ( 1 ); // Выход из функцииcase137 : Alert ( "Брокер занят. Пробуем ещё раз.." );
Sleep ( 3000 ); // Простое решениеreturn ( 1 ); // Выход из функцииcase146 : Alert ( "Подсистема торговли занята. Пробуем ещё.." );
Sleep ( 500 ); // Простое решениеreturn ( 1 ); // Выход из функции// Критические ошибкиcase2 : Alert ( "Общая ошибка." );
return ( 0 ); // Выход из функцииcase5 : Alert ( "Старая версия терминала." );
Work= false ; // Больше не работатьreturn ( 0 ); // Выход из функцииcase64 : Alert ( "Счет заблокирован." );
Work= false ; // Больше не работатьreturn ( 0 ); // Выход из функцииcase133 : Alert ( "Торговля запрещена." );
return ( 0 ); // Выход из функцииcase134 : Alert ( "Недостаточно денег для совершения операции." );
return ( 0 ); // Выход из функцииdefault : Alert ( "Возникла ошибка " ,Error); // Другие варианты return ( 0 ); // Выход из функции
}
}
sormak istedim. Buna 129 hatadan aşağıdaki satırı ekleyebilir miyim, örneğin bunun gibi?
Görsel stüdyonun tüm projesi uzmanlar klasöründe var ... Derleme - bu bir .exe dosyası, değil mi? Kitaplıklar klasörüne kopyalamak istedim ... bulamıyorum! İşte proje hata ayıklama klasörü. Üzgünüm, bu yeni bir konu.
İşte projenin .cpp dosyası , bir bakacağım ve birkaç kez Google ve Yandex'e gideceğim, beynimi bulandıran bir şey bulamadım, genel olarak anlaşılabilir. Hatta basit görünüyor.
Ama nasıl çalışıyor? Bu ddl'ye nasıl erişeceğimi tam olarak anlamadım - EA kodundan? Nasıl? İlk olarak, bu gibi görünüyor #include <GetIntValue> Hayır, bir sorun var ..
2. Bir dll çağırırken, stüdyoyu açık tutmak gerekli değildir, değil mi? nasıl yapılır?
Lütfen aynı dll'ye mql kodundan erişmenin en basit örneğini gösterin.
ben burdan birşey anlamadım..
ikinci bir tek yönlü sipariş açılırsa parti büyüklüğünün katlanarak (2 çarpanıyla) artması gerekir.
sonuç bu
o zaman böyle
sonuç bu
o zaman böyle
teşekkürler, düşünce trenini anladım.. Daha doğru anladım.
bu hat ne için?
datetime o;İşte başka bir soru. Bir treylerim var. 1 tek yönlü sipariş açık olduğunda, her şey harika çalışıyor, eğer daha fazlaysa, o zaman nedense çalışmıyor. Niye ya?
{
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask + (TrailingStop+ TrailingStep)*Point)
{
SL = NormalizeDouble (Ask+TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify (OrderTicket(), OrderOpenPrice(), SL,0,0);
}
}
}
}
}
}
}
İşte projenin .cpp dosyası, bir bakacağım ve birkaç kez Google ve Yandex'e gideceğim, beynimi bulandıran bir şey bulamadım, genel olarak anlaşılır. Hatta basit görünüyor.
Ama nasıl çalışıyor? Bu ddl'ye nasıl erişeceğimi tam olarak anlamadım - EA kodundan? Nasıl? İlk olarak, bu gibi görünüyor #include <GetIntValue> Hayır, bir sorun var ..
Yaklaşık olarak bu şekilde. Çalıştırmak için DLL'yi derlemeniz ve bunu uzmanlar/kütüphaneler klasörüne koymanız gerekir (yardımı ve öğreticiyi okuyun, orada her şey ayrıntılı olarak açıklanmıştır).
2. Bir dll çağırırken, stüdyoyu açık tutmak gerekli değildir, değil mi? nasıl yapılır?
İşte başka bir soru. Bir treylerim var. 1 tek yönlü sipariş açık olduğunda, her şey harika çalışıyor, eğer daha fazlaysa, o zaman nedense çalışmıyor. Niye ya?
{
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask + (TrailingStop+ TrailingStep)*Point)
{
SL = NormalizeDouble (Ask+TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify (OrderTicket(), OrderOpenPrice(), SL,0,0);
}
}
}
}
}
}
}
fonksiyona parametre iletmek gerektiğinden, bunu deneyin
bool IfProfTrail=yanlış; // Yalnızca karlı pozisyonlar için kullanın - başabaş modu
int TrailingStop=0; // Takip mesafesi = 0 - izin verilen minimum
int TrailingStep=1; // mesafe adımı
Çok teşekkürler!
Şimdi sorunun ne olduğu ortaya çıktı.
Satın almak için kullanılır:
Bildiğim kadarıyla, satın alma işlemi sor ile yapılıyor ve iClose(Symbol(),Period(),0) fiyatları tekliften alıyor. Sonuç olarak, hata oluşması muhtemeldir.
Ancak, soru hemen ortaya çıkıyor, çünkü danışman bir pip değil, fiyat uzun süredir satın alma bölgesindeydi ve her tik ile güncellendi.Şimdi aşağıdaki kombinasyonu kullanıyorum:
Anlaşma neden açılmıyor? Danışmanın bir hata üzerine donduğu ve başka bir fiyat değişikliği görmediği ortaya çıktı?
Expert Advisor için şablonu buradan aldım https://c.mql5.com/mql4/book/mq4/experts/tradingexpert.mq4
Sizce bu EA'daki hata işleme işlevine 129 ve 138 hataları için bir kontrol eklemeye değer mi?
Evet ise, o zaman nasıl yapılır?
En azından, tüm hataları ele alan pozisyonları açmak/emirleri ayarlamak için kendi işlevinize sahip olmalısınız. İçinde en son fiyatları almanız gerekiyor.
Herhangi bir yapıya bakmadım. Ancak şunu söyleyeceğim: Expert Advisor'da sunucu tarafından döndürülen tüm hataları işlemeniz gerekir. Ve bu yeterli değil. Öngörülemeyen herhangi bir durumda, işlevsellik kaybı olmadan ve algoritması bozulmadan pozisyonlarını alabilmeli ve olağanüstü bir şey olmamış gibi çalışmalarına devam edebilmelidir.
En azından, tüm hataları ele alan pozisyonları açmak/emirleri ayarlamak için kendi işlevinize sahip olmalısınız. İçinde en son fiyatları almanız gerekiyor.
Herhangi bir yapıya bakmadım. Ancak şunu söyleyeceğim: Expert Advisor'da sunucu tarafından döndürülen tüm hataları işlemeniz gerekir. Ve bu yeterli değil. Öngörülemeyen herhangi bir durumda, işlevsellik kaybı olmadan ve algoritması bozulmadan pozisyonlarını alabilmeli ve olağanüstü bir şey olmamış gibi çalışmalarına devam edebilmelidir.
Şablon ders kitabından alınmıştır. Şu anda hata işleme işlevlerinde özellikle güçlü değil.
Emirlerin açılışında RefreshRates() vardır; (dedikleri gibi, teklifler ve talepler piyasa bilgileri aracılığıyla değiştirilir)
Ve hata işleme işlevi:
sormak istedim. Buna 129 hatadan aşağıdaki satırı ekleyebilir miyim, örneğin bunun gibi?