KimIV'ten faydalı özellikler - sayfa 49

 
KimIV писал (а) >>

ExistOrders() işlevini kullanma örnekleri.

5. Kurulum süresi en geç 2 saat olan herhangi bir sipariş olup olmadığını kontrol edin.

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

İyi akşamlar! Bu yorumla biraz kafam karıştı. Oturup düşünüyorum! Durumumu nasıl doğru bir şekilde formüle edeceğimi anlayamıyorum - “5 dakikadan daha erken değil” veya “5 dakikadan geç değil”! (Ben bunu düşünene kadar her şey açıktı!)

Belirtilen süre içinde tetiklenmemişse bekleyen bir siparişi silmem gerekiyor. Örneğin, kurulumdan sonra 5 dakika içinde!

şöyle yaptım:

 if ( ExistOrders ( NULL , OP_BUYSTOP , Magic , TimeCurrent () - 5 * 60 ) > 0 ) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders ( NULL , OP_BUYSTOP , Magic ) ;
if ( ExistOrders ( NULL , OP_SELLSTOP , Magic , TimeCurrent () - 5 * 60 ) > 0 ) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders ( NULL , OP_SELLSTOP , Magic ) ;

Bu doğru? Ama test cihazında çalışmıyor. Siparişler verilir ve hemen silinir.

Lütfen. ExistOrders() işlevini nasıl doğru yazacağımı söyle?

 
rid писал (а) >>
Biraz kafam karıştı...

Benim de kafam karıştı gibi görünüyor. Birlikte çözelim... :-)

Ot parametresi (sipariş verme süresi) 128, 142 ve 143 hatalarını doğru bir şekilde işlemek için ExistOrders işlevine eklenmiştir. Bu hataları ele almanın amacı, aynı siparişin çift (ve pratik durumlarda üçlü) yerleşimini ortadan kaldırmaktır. Bunun için alım satım emri gönderme zamanı hatırlanır ve alım satım denemelerinde bir duraklama yapılır. Bir duraklamadan sonra, bir siparişin varlığı, belleğe alınandan sonraki kurulum süresi ile kontrol edilir. Bir emir varsa, hedefe ulaşıldığı (siparişin verildiği) sonucuna varılır ve alım satım girişimleri durdurulur. Yani ot parametresine süre iletilir, ardından siparişler kontrol edilir. Daha sonra = daha erken değil .

kurtulmak (a) yazdı >>
Belirtilen süre içinde tetiklenmemişse bekleyen bir siparişi silmem gerekiyor. Örneğin, kurulumdan sonra 5 dakika içinde!

ExistOrders fonksiyonunun ot parametresi burada size yardımcı olmayacaktır. Diğer şekilde çalışıyor. Günümüze daha yakın. Ve geçmişe silmeyi kullanmanız gerekir. Expiration (expiration), OrderSend fonksiyonunun expiration parametresi ( veya SetOrder fonksiyonumun ex parametresi) bunun için harika.

 

Test cihazı için ClosePosBySelect() işlevi.

Önceden seçilmiş bir pozisyonun kapanmasını gerçekleştirir. Bu, daha önce 13. sayfada yayınlanmış olan aynı adlı işlevin hafif bir sürümüdür. Ekstra bir şey yok. Hayır fırfırlar. Benim uygulamamda, test cihazında bir pozisyonun kapatılmadığı hiçbir durum olmadı. Bu nedenle, bu fonksiyonda kontrol yoktur. Test cihazında gereksizdirler.

 //+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect () {
   double pp ;

   if ( OrderType () == OP_BUY ) {
     pp = MarketInfo ( OrderSymbol () , MODE_BID ) ;
     OrderClose ( OrderTicket () , OrderLots () , pp , Slippage , clCloseBuy ) ;
   }
   if ( OrderType () == OP_SELL ) {
     pp = MarketInfo ( OrderSymbol () , MODE_ASK ) ;
     OrderClose ( OrderTicket () , OrderLots () , pp , Slippage , clCloseSell ) ;
   }
}

not. Test cihazı için OpenPosition() fonksiyonu ile birlikte ClosePosBySelect() fonksiyonunun kullanımına daha sonra bir örnek vereceğim.

 

Merhaba. Her seferinde sayfaları kürek çekmemek için içeriği dal boyunca yapmak zorunda kaldım.

Bazı yerlerde benzer konulardaki işlevleri birleştirdim. 1 ila 40 sayfa arası içerik.

Dileyenler devam edip başka sayfalar ekleyip burada yayınlayabilirler.

Dosyalar:
 

Merhaba Igor! Yardımınıza ihtiyaçım var. e-CloseByPercentProfit'e benzer şekilde e-CloseByProfit Expert Advisor'a terminal kapatma fonksiyonunu eklemeye karar verdim.

Her şey yolunda gitti, danışman çalışıyor, terminal kapanıyor. Ancak terminal tekrar açıldığında danışman hemen kapatıyor.

Lütfen bu sorunu çözmek için kodu değiştirmeme yardım edin.

//+------------------------------------------- ------------------------------+
//| e-CloseByProfit.mq4 |
//| Kim Igor V. namı diğer KimIV |
//| http://www.kimiv.ru |
//| |
//| 22.10.2006 Uzman Danışman belirtilen |
//| kar seviyesi puanları. |
//| 06/20/2008 Puan cinsinden sabit kar hesaplama hatası. |
//+------------------------------------------- ------------------------------+
#özellik telif hakkı "Kim Igor V. aka KimIV"
#özellik bağlantısı " http://www.kimiv.ru "
#define MAGIC 20061022

//------- EA'nın dış parametreleri ------------------------------------ ------
extern string _P_Expert = "---------- Uzman Danışman Seçenekleri";
extern bool CurSymbolOnly = false; // Yalnızca geçerli karakter
harici int TakeProfit = 100; // Almak
extern bool CloseTerminal = False; // terminali kapat
extern bool ShowComment = Doğru; // Yorumu göster
harici int SayıHesabı = 0; // Ticaret hesap numarası
extern bool UseSound = True; // Ses sinyali kullan
harici dize NameFileSound = "manycoin.wav"; // Ses dosyası adı
dış int kayma = 3; // Fiyat kayması
harici int SayıOfDeneme = 5; // Deneme miktarı

//-------Uzman Danışman global değişkenler ------------------------------------- -
renk clCloseBuy = Mavi; // Satın alma işlemini kapat simgesinin rengi
renk kapaSat = Kırmızı; // Satışı kapat simgesinin rengi
int CurProfit;

//-------Harici modüllerin bağlanması ------------------------------------------ -----
#include <stdlib.mqh>
#include <WinUser32.mqh>

//+------------------------------------------- ------------------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- ------------------------------+
void init() { if (!IsTesting()) Yorum(""); }

//+------------------------------------------- ------------------------------+
//| uzman sıfırlama işlevi |
//+------------------------------------------- ------------------------------+
void deinit() { if (!IsTesting()) Yorum(""); }

//+------------------------------------------- ------------------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- ------------------------------+
geçersiz başlangıç() {
if (!IsTesting()) {
if (SayıHesabı>0 && SayıHesabı!=HesapNumarası()) {
Message("Hesapta TİCARET YASAKTIR"+HesapNumarası());
dönüş;
} başka Yorum("");
}

CloseByProfit();
if (Yorumu Göster) {
Comment(IIFs(CurSymbolOnly, "CurSymbolOnly ",""),
"Mevcut kâr=",CurProfit," s.",
" Kapanış kârı=",TakeProfit," s."
);
}
}


//+------------------------------------------- ------------------------------+
//| Yazar : Kim Igor V. namı diğer KimIV, http://www.kimiv.ru |
//+------------------------------------------- ------------------------------+
//| Sürüm : 02/19/2008 |
//| Açıklama: Önceden seçilmiş bir konumu kapat |
//+------------------------------------------- ------------------------------+
geçersiz ClosePosBySelect() {
bool fc;
yakın renk;
çift ll, pa, pb, pp;
int hata, o;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
Yeniler();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clClose=kapatKapatSatın al;
} başka {
pp=pa; clKapat=kapatKapaSat;
}
ll=SiparişLotları();
fc=OrderClose(OrderTicket(), ll, pp, Kayma, clClose);
eğer (fc) {
if (UseSound) PlaySound(NameFileSound); kırmak;
} başka {
err=GetLastError();
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Kapat ",GetNameOP(OrderType())," ",
ErrorDescription(err),", deneyin ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Uyku(1000*5);
}
}
} else Print("Yanlış ticaret işlemi. Kapat ",GetNameOP(OrderType()));
}

//+------------------------------------------- ------------------------------+
//| Yazar : Kim Igor V. namı diğer KimIV, http://www.kimiv.ru |
//+------------------------------------------- ------------------------------+
//| Sürüm : 02/19/2008 |
//| Açıklama : İlk kârlı piyasa fiyatından pozisyonları kapatmak |
//+------------------------------------------- ------------------------------+
//| Seçenekler: |
//| sy - enstrüman adı ("" - herhangi bir sembol, |
//| NULL - geçerli karakter) |
//| operasyon - operasyon (-1 - herhangi bir pozisyon) |
//| mn - MagicNumber (-1 - herhangi bir büyü) |
//+------------------------------------------- ------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=SiparişToplam();
if (sy=="0") sy=Symbol();

// İlk kapanış karlı pozisyonlar
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==dk) {
if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// Sonra geri kalan her şey
k=SiparişToplam();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}

//+------------------------------------------- ------------------------------+
//| Tüm pozisyonları kâr için kapatmak. |
//+------------------------------------------- ------------------------------+
geçersiz CloseByProfit() {
çift pa, pb, pp;
int i, k=SiparişToplam(), pr=0;

for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
pp=MarketInfo(OrderSymbol(), MODE_POINT);
if (pp==0) if (StringFind(OrderSymbol(), "JPY")<0) pp=0,0001; başka pp=0.01;
if (OrderType()==OP_BUY) {
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp, 0);
}
if (OrderType()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0);
}
}
}
}
CurProfit=pr;
if (CurProfit>=TakeProfit) ClosePosFirstProfit();
if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
//+------------------------------------------- ------------------------------+
//| Ticaret terminalini kapatır. |
//+------------------------------------------- ------------------------------+
void CloseTerminal() {
Print("CloseTerminal() işlevi çalıştı");
int hwnd=WindowHandle(Symbol(), Period());
int hwnd_parent=0;

while(!IsStopped()) {
hwnd=GetParent(hwnd);
eğer (hwnd==0) kırılır;
hwnd_parent=hwnd;
}
if (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
}

//+------------------------------------------- ------------------------------+
//| Konum varlığı bayrağını döndürür |
//| Seçenekler: |
//| sy - enstrüman adı ("" - herhangi bir sembol, |
//| NULL - geçerli karakter) |
//| operasyon - operasyon (-1 - herhangi bir pozisyon) |
//| mn - MagicNumber (-1 - herhangi bir büyü) |
//+------------------------------------------- ------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1) {
int i, k=SiparişToplam();

if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
dönüş(yanlış);
}
//+------------------------------------------- ------------------------------+
//| Yazar : Kim Igor V. namı diğer KimIV, http://www.kimiv.ru |
//+------------------------------------------- ------------------------------+
//| Sürüm : 01/09/2005 |
//| Açıklama : Bir ticaret işleminin adını döndürür |
//+------------------------------------------- ------------------------------+
//| Seçenekler: |
//| op - ticari işlem tanımlayıcısı |
//+------------------------------------------- ------------------------------+
string GetNameOP(int op) {
geçiş (op) {
case OP_BUY : iade("Satın Al");
case OP_SELL : dönüş("Sat");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT: return("SellLimit");
case OP_BUYSTOP : dönüş("BuyStop");
case OP_SELLSTOP : return("SellStop");
default : return("Bilinmeyen İşlem");
}
}

//+------------------------------------------- ------------------------------+
//| Yazar : Kim Igor V. namı diğer KimIV, http://www.kimiv.ru |
//+------------------------------------------- ------------------------------+
//| Sürüm : 01/02/2008 |
//| Açıklama : Duruma göre iki değerden birini döndürür. |
//+------------------------------------------- ------------------------------+
string IIF'ler(bool koşulu, string ifTrue, string ifFalse) {
if (koşul) dönüş(ifTrue); başka bir dönüş(ifFalse);
}

//+------------------------------------------- ------------------------------+
//| Bir yorumda ve günlükte mesaj görüntüleme |
//+------------------------------------------- ------------------------------+
geçersiz Mesaj(string m) {
yorum(m);
if (StringLen(m)>0) Print(m);
}
//+------------------------------------------- ------------------------------+

 
Vkorch писал (а) >>
Merhaba Igor! Yardımınıza ihtiyaçım var. e-CloseByPercentProfit'e benzer şekilde e-CloseByProfit Expert Advisor'a terminal kapatma fonksiyonunu eklemeye karar verdim.

Her şey yolunda gitti, danışman çalışıyor, terminal kapanıyor. Ancak terminal tekrar açıldığında danışman hemen kapatır.
Lütfen bu sorunu çözmek için kodu değiştirmeme yardım edin.

Bunu şu şekilde yapın:

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а) >>

Bunu şu şekilde yapın:

Teşekkürler Igor. Düzeltildi. Ama derlerken bir hata alıyorum

'(' - fonksiyon tanımı beklenmeyen C:\Program Files\MetaTrader - Alpari\experts\e-CloseByProfit.mq4 (180, 19)

Nasıl olunur?

 

Igor, kütüphane şeklinde düzenlemeyi zorlaştırmayacak - fonksiyonlar emir ve pozisyonlarla çalışın. Belki işine yarar, şu an kullandığım şey, lütfen orada nasıl yapıldığına bakın, kütüphane 2 yıldan fazla bir süredir geliştirildi ve test edildi, dosyaları ekliyorum, bazı fikirler işe yarayabilir.

Hakkında

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

OpenPosition (" GBPJPY ", OP _ SELL , 0.1, 23, 44);

a

çift pa = MarketInfo ( " USDCAD " , MODE_ASK ) ;
 çift pb = MarketInfo ( " USDCAD " , MODE_BID ) ;
 çift po = MarketInfo ( " USDCAD " , MODE_POINT ) ;
 ve burada Bu sokmak 
   double lot_min =MarketInfo(Symbol(),MODE_MINLOT);
    if(Lots<lot_min) dönüşü;

fonksiyonun içinde hesaplayın, yani değer gönder sl ve tp ve içinde her şeyi hesaplamak ve normalleştirmek zaten doğru.


	          
Dosyalar:
 

Merhaba Igor!

Pozisyonların bölünmesini çözemiyorum. 0,3 lotluk bir pozisyon açıksa, yapmam gerekenler:

1. 0.1 lot pozisyonunun bir kısmını kapatın.

Değiştir (kayıp durdurmayı başka bir seviyeye taşı)

2. 0.1 lot pozisyonunun hala bir kısmını kapatın.

Değiştir (kayıp durdurmayı başka bir seviyeye taşı)

3. Konumu kapatın.

Ve bir soru daha? Parçayı ve konumu kapatırken

OrderClose (OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,Violet);

131 hatası (yanlış birim) oluşuyor Nasıl düzeltilir?

Lütfen yeni başlayana cevap verin, kelimelerle mümkündür.

.

 
Prival писал (а) >>
Igor, kütüphane şeklinde düzenlemeyi zorlaştırmayacak - fonksiyonlar emir ve pozisyonlarla çalışın.

Hayır, zorlaştırmayacak... prensipte, zaten olması gerektiği gibi biçimlendirilmiş... Göndermiyorum, çünkü bu kütüphanedeki tüm işlevler henüz yayınlanmadı... birkaçı kaldı. bu konunun başlamasından sonra ortaya çıktı.

Gerisini düşüneceğim...

Neden: