KimIV'ten faydalı özellikler - sayfa 92

 
alexpert007 >> :

Ve işte Igor için başka bir soru.

Alış-satış pozisyonunu tersine çevirmek için ayrı bir özel (veya başka) bir işlev yarattınız mı ve bunun tersi de normal OrderClose - OrderSend olmadan mı?

Ben Igor değilim, ancak çevirme için standart bir OrderCloseBy işlevi var.

 

Merhaba! Sorunun çözümü için yardım rica ediyorum. tarif etmeye çalışacağım:

Siparişleri sayan bir fonksiyon var:

int OrdersAll(int mag)
{
int sayı=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (Sipariş Seçimi(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++;
}
}
dönüş(kolvo);
}

Akım için tek bir sipariş yoksa, çalışma sürecinde ayrıca. enstrüman, koşul karşılandığında, örneğin satın almak için 1 sipariş verilmelidir, şöyle yazılır:

if (OrdersAll(MAGICNO)==0)
{
eğer(koşul)
{
op=Ask;if(SL>0){sl=Ask-SL*Nokta*mn;}if(TP>0){tp=Ask+TP*Nokta*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Rakamlar),"",MAGICNO,0,Mavi);
eğer(hata<0)
{
Print("OrderSend()- OP_BUY hatası. Sipariş kabul edilmedi . op "+op+" sl "+sl+" tp "+tp+" "+GetLastError());return(-1);
}
}
}

Bunun yerine, örneğin terminalde birkaç araç açarken ve her birinde bir danışman çalıştırırken, yukarıdaki kod bir sipariş açabilir - bu doğrudur, ancak aynı zamanda mors bitene kadar 20-30 sipariş açabilir. , durum birkaç kene sürerse. Bu henüz tek bir araçla fark edilmedi, ancak bunun tek bir araçla da olmayacağından emin değilim. Birden fazla sipariş açmanın zor olması için kodumu nasıl düzeltebilirim.

 

Igor, iyi akşamlar,

İşlevinizi çağırmayı beceremiyorum:

//+------------------------------------------- ------------------------------+
//| Yazar : Kim Igor V. namı diğer KimIV, http://www.kimiv.ru |
//+------------------------------------------- ------------------------------+
//| Sürüm : 02/19/2008 |
//| Açıklama : Mevduat para biriminde açık pozisyonların toplam kârı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ü) |
//+------------------------------------------- ------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
çift p=0;
int i, k=SiparişToplam();

if (sy=="0") sy=Symbol();
for (i=0; i<k; 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) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
dönüş(p);
}

Söyle bana, TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1);

1. EURUSD'nin "EURUSD" tırnak içinde olması veya şunlar olmadan izin verilmesi gerektiğini varsayın;

2. Satın alma ve oturma toplam kârını hesaplamak için ikinci çağrı parametresi ne olmalıdır (kısa çizgi nerede) (varsayılan -1 denendi; doğru değil)

3. Üçüncü parametre uzmanın sihirli numarası mı? - Henüz ulaşmadım, sadece parametreyi doğru anlayıp anlamadığımla ilgili bir soru.

Teşekkür ederim.

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1);

- sadece EURUSD için

- tüm açık pozisyonlar (-1)

- herhangi bir büyüye sahip pozisyonlar (-1)

 

Tünaydın.

Bildiğiniz gibi, Sleep() işlevi terminal test cihazında çalışmaz, bu nedenle yürütmeyi geciktirmek için matematiksel işlevlerden döngüleri kullanmanız gerekir:

 if ( IsTesting ( ) = = true ) { for ( int z0 = 1 ; z0 < zFILE * 10000 ; z0 + + ) { MathSqrt ( MathPow ( 5 , 5 ) ) ; MathSqrt ( MathPow ( 5 , 5 ) ) ; MathSqrt ( MathPow ( 5 , 5 ) ) ; } }

nerede zFILE - Expert Advisor yürütme gecikmesi.

Soru şudur: Gecikme birkaç saniyeden 10-20 dakikaya kadar (harici bir program tarafından veri işleme) gerektiğinden daha zarif bir çözüm (gecikme işlevi) var mı?

Veya en azından işlevlerin yürütme süresi nasıl daha doğru bir şekilde ölçülür (çünkü işlemcilerin hızı herkes için farklıdır) ve en frenleyici olanı nasıl seçersiniz?

 
Piboli >> :

Soru şudur: Gecikme birkaç saniyeden 10-20 dakikaya kadar (harici bir program tarafından veri işleme) gerektiğinden daha zarif bir çözüm (gecikme işlevi) var mı?

Geri aramaları ve senkronize edicileri kullanmayı denediniz mi?

 

Kim'in işlevleri

ilginç bir şekilde, son atılan şablonun adını çıkarmanıza izin veren bir işlev var

ve bileşenlerindeki değişiklikleri düzeltin


 

KimIV bir gösterge yazabilir ve yazabilir misiniz?

Gösterge, belirtilen süre boyunca düz bir kanal aramalı ve ayarlarda belirtilenden daha geniş olmamalıdır.

Bu kanal göstergesi, isTradeTimeInt() Fonksiyonunuzda olduğu gibi hem gün içinde hem de ertesi güne geçişte arama yapmalıdır.
Bu gösterge günde 5 kanal veya sadece bir kanal çekebilir.
Ayarlar yapıldı

puan cinsinden harici çift maksimum kanal yüksekliği
extern int Bar_Time zaman aralığını bar(1) veya saat ve dakika(2) olarak nasıl koruyacağız
saat ve dakika cinsinden harici dize minimum kanal zaman aralığı
çubuklarda çubuklarda extern int minimum kanal zaman aralığı
extern int Çizilmiş kalan maksimum çizilen kanal sayısı

Benzer bir gösterge https://www.mql5.com/en/code ekliyorum ancak belirli bir süre için bir kanal çekiyor ve böyle bir kanalı kendisi aramıyor. Maksimum kanal yüksekliğini aşmayan ve en azından minimum kanal zaman aralığını sürdüren böyle bir kanalı kendisi aramalıdır.
Bar_Time by time'ı seçersek, kanal (1), mevcut zamandan, ayarlarda belirtilen süreden, yani 2 saat 15 dakika veya başka bir belirtilen süreden korunur.Kanalın maksimum yüksekliği, maksimum iki satır çizer ve minimum uzunluk 23:00 ile 02:15 arası. Fibo seviyeleri de kanalın üstünde ve altında çizilir.

Bar_Time'ı bar sayısı ile seçersek, kanal mevcut bardan ayarlarda belirtilen bar sayısı çıkar, yani sıfır bardan sıfır bara eksi ayarlarda belirtilen sayı kadar ayarlanır. Verilen sayı 50 ise şimdi sıfır çubuğundan başlayarak son 50 çubuk için maksimum ve minimum arayacağız ve maksimum eksi minimum kanalın maksimum yüksekliğini geçmiyorsa iki çizgi çiziyor. , maksimum ve minimum 50 bar uzunluğunda.Fibo seviyeleri ayrıca kanalın üstünde ve altında çizilir

Tüm kanal seviyeleri ve veriler arabelleklerde saklanır

 

Igor'a soru

Mümkünse, her bir Hesabın durumunu sorgulayan (lot büyüklüğünü hesaplamak için) iki ayrı hesap üzerinde çalışan (Alım Sat) bir Uzman Danışman kodunun belirli bir parçası ve aynı zamanda hesaptan hesaba depo aktarma özelliği de vardır. belirli koşullar altında mevduatın bir kısmını çekmek için bir simülatör olarak (örneğin, aylık veya üç aylık kar - ondan% n)

soruyu açıklıyorum

1 EA Satın Al (anket hesabı durumu 2) için çalışıyor .. 6200

EA 2 Sat için çalışıyor (hesap 1 durumunu yoklar) .. 8400

Açık pozlar yoksa

1100 hesap 2'den hesap 1'e

Hesap 1 - 7300

hesap 2 - 7300

toplam mevduat SD=14600 Maksimum risk - %10 Maksimum lot 0.14

Daha ileri

01.04.09 SD=10000 itibariyle

01.07.09 SD=14600 itibariyle

Kar=4600

%10 = 460

460 üçüncü hesaba para çekme

teşekkürler

 

Sevgili Igor! Yardım edin!

a-SimpleTrailing.mqh dahildir .

Belirtilenleri ekledim ancak 3 hata çıkıyor :

'clModifyBuy' - değişken tanımlı değil
'clModifySell' - değişken tanımlı değil
'ti' - değişken zaten tanımlanmış

Ne yapalım?(



İşte dahil olanlar:

.........................
   total = OrdersTotal ( ) ;
   if ( total < 1 )
     {
      if ( AccountFreeMargin ( ) < ( 1000 * Lots ) )
        {
         Print ( "У вас нет денег. Свободные средства = " , AccountFreeMargin ( ) ) ;
         return ( 0 ) ;
        }
      if ( Hour ( ) > = 0 )
        {
         chk = 1 ;
         Print ( "Позиция возможна!" ) ;
        }
      if ( chk = = 1 )
        {
         if ( ( Low [ 0 ] < = MaDert1sell ) | | ( Low [ 0 ] < = MaDert2sell ) )
           {
int ti = OpenPosition ( NULL , OP_BUY , 0.1 ) ;
if ( OrderSelect ( ti , SELECT_BY_TICKET ) )
ModifyOrder ( - 1 , Ask - 30 * Point , Bid - 99 * Point , clModifySell ) ;
            if ( ticket > 0 )
              {
               if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) )
                  Print ( "Открыт ордер SELL : " , OrderOpenPrice ( ) ) ;
               chk = 0 ;
              }
            else
              {
               Print ( "Ошибка открытия SELL ордера : " , GetLastError ( ) ) ;
               return ( 0 ) ;
              }
           }
         if ( ( High [ 0 ] > = MaDert1buy ) | | ( High [ 0 ] > = MaDert2buy ) )
           {
int ti = OpenPosition ( NULL , OP_BUY , 0.1 ) ;
if ( OrderSelect ( ti , SELECT_BY_TICKET ) )
ModifyOrder ( - 1 , Ask - 30 * Point , Bid - 99 * Point , clModifyBuy ) ;
            if ( ticket > 0 )
              {
               if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) )
                  Print ( "Открыт ордер BUY : " , OrderOpenPrice ( ) ) ;
               chk = 0 ;
              }
            else
              {
               Print ( "Ошибка открытия BUY ордера : " , GetLastError ( ) ) ;
               return ( 0 ) ;
              }
           }
        }
      return ( 0 ) ;
     }
   for ( cnt = 0 ; cnt < total ; cnt + + )
     {
      OrderSelect ( cnt , SELECT_BY_POS , MODE_TRADES ) ;
      if ( OrderType ( ) < = OP_SELL & &   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol ( ) = = Symbol ( ) )  // инструмент совпадает?
        {
         if ( OrderType ( ) = = OP_BUY )   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if ( Hour ( ) = = 23 )
              {
               chk = 0 ;
               OrderClose ( OrderTicket ( ) , OrderLots ( ) , Bid , 3 , Violet ) ; // закрываем позицию
               return ( 0 ) ; // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if ( Hour ( ) = = 23 )
              {
               chk = 0 ;
               OrderClose ( OrderTicket ( ) , OrderLots ( ) , Ask , 3 , Violet ) ; // закрываем позицию
               return ( 0 ) ; // выходим
              }

           }
        }
     }
   return ( 0 ) ;
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder ( double pp = - 1 , double sl = 0 , double tp = 0 , color cl = CLR_NONE ) {
  bool   fm ;
  double op , pa , pb , os , ot ;
  int    dg = MarketInfo ( OrderSymbol ( ) , MODE_DIGITS ) , er , it ;
 
  if ( pp < = 0 ) pp = OrderOpenPrice ( ) ;
  if ( sl < 0 ) sl = OrderStopLoss ( ) ;
  if ( tp < 0 ) tp = OrderTakeProfit ( ) ;
  
  pp = NormalizeDouble ( pp , dg ) ;
  sl = NormalizeDouble ( sl , dg ) ;
  tp = NormalizeDouble ( tp , dg ) ;
  op = NormalizeDouble ( OrderOpenPrice ( ) , dg ) ;
  os = NormalizeDouble ( OrderStopLoss ( )  , dg ) ;
  ot = NormalizeDouble ( OrderTakeProfit ( ) , dg ) ;
 
  if ( pp ! = op | | sl ! = os | | tp ! = ot ) {
    for ( it = 1 ; it < = NumberOfTry ; it + + ) {
      if ( ! IsTesting ( ) & & ( ! IsExpertEnabled ( ) | | IsStopped ( ) ) ) break ;
      while ( ! IsTradeAllowed ( ) ) Sleep ( 5000 ) ;
      RefreshRates ( ) ;
      fm = OrderModify ( OrderTicket ( ) , pp , sl , tp , 0 , cl ) ;
      if ( fm ) {
        if ( UseSound ) PlaySound ( NameFileSound ) ; break ;
      } else {
        er = GetLastError ( ) ;
        pa = MarketInfo ( OrderSymbol ( ) , MODE_ASK ) ;
        pb = MarketInfo ( OrderSymbol ( ) , MODE_BID ) ;
        Print ( "Error(" , er , ") modifying order: " , ErrorDescription ( er ) , ", try " , it ) ;
        Print ( "Ask=" , pa , "  Bid=" , pb , "  sy=" , OrderSymbol ( ) ,
              "  op=" + GetNameOP ( OrderType ( ) ) , "  pp=" , pp , "  sl=" , sl , "  tp=" , tp ) ;
        Sleep ( 1000 * 10 ) ;
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP ( int op ) {
	switch ( op ) {
		case OP_BUY      : return ( "Buy" ) ;
		case OP_SELL     : return ( "Sell" ) ;
		case OP_BUYLIMIT : return ( "Buy Limit" ) ;
		case OP_SELLLIMIT : return ( "Sell Limit" ) ;
		case OP_BUYSTOP  : return ( "Buy Stop" ) ;
		case OP_SELLSTOP : return ( "Sell Stop" ) ;
		default          : return ( "Unknown Operation" ) ;
	}
}
//+----------------------------------------------------------------------------+