[ARŞİV!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 4. - sayfa 392

 
Merhaba! Pro, söyle lütfen! Bir EA'da nasıl yazılır, böylece bir bahis kapatıldığında, EA aynı çubukta ters yönde yeni bir bahis alır ("çevirme" gibi). "Yeni bir çubuk açıldığında" modeline göre test ediyorum. Örneğin, bir danışman:
 //+------------------------------------------------------------------+
//|                                                      CrossMa.mq4 |
//|                      Copyright © 2005, George-on-Don             |
//|                                       http://www.forex.aaanet.ru |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
#include <stderror.mqh>
 
#define MAGICMA   20050610
 
extern double Lots               = 0.1 ;
extern double MaximumRisk        = 0.02 ;
extern double DecreaseFactor     = 3 ;
extern double MovingPeriod       = 12 ;
extern double MovingShift        = 0 ;
extern double MovingPeriod1      = 4 ;
extern double AtrPer             = 6 ;
extern bool    SndMl              = True ;
//+------------------------------------------------------------------+
//| Расчет открытия позиции                                          |
//+------------------------------------------------------------------+
int CalculateCurrentOrders( string symbol)
  {
   int buys= 0 ,sells= 0 ;
//----
   for ( int i= 0 ;i< OrdersTotal ();i++)
     {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)==false) break ;
       if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==MAGICMA)
        {
         if ( OrderType ()==OP_BUY)  buys++;
         if ( OrderType ()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if (buys> 0 ) return (buys);
   else        return (-sells);
  }
//+------------------------------------------------------------------+
//| Расчет оптимальной величины лота                                 |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int     orders=HistoryTotal();     // history orders total
   int     losses= 0 ;                   // number of losses orders without a break
//---- select lot size
   lot= NormalizeDouble ( AccountFreeMargin ()*MaximumRisk/ 1000.0 , 1 );
//---- calcuulate number of losses orders without a break
   if (DecreaseFactor> 0 )
     {
       for ( int i=orders- 1 ;i>= 0 ;i--)
        {
         if ( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)==false) { Print ( "Error in history!" ); break ; }
         if ( OrderSymbol ()!= Symbol () || OrderType ()>OP_SELL) continue ;
         //----
         if ( OrderProfit ()> 0 ) break ;
         if ( OrderProfit ()< 0 ) losses++;
        }
       if (losses> 1 ) lot= NormalizeDouble (lot-lot*losses/DecreaseFactor, 1 );
     }
//---- return lot size
   if (lot< 0.1 ) lot= 0.1 ;
   return (lot);
  }
//+------------------------------------------------------------------+
//| Проверка для открытия позиции с первым тиком нового бара.        |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   double Atr;
   int     res;
   string sHeaderLetter;
   string sBodyLetter;
//---- go trading only for first tiks of new bar
   if (Volume[ 0 ]> 1 ) return ;
//---- get Moving Average 
   mas= iMA ( NULL , 0 ,MovingPeriod,MovingShift, MODE_SMA , PRICE_CLOSE , 1 ); // динный мувинг 12
   maf= iMA ( NULL , 0 ,MovingPeriod1,MovingShift, MODE_SMA , PRICE_CLOSE , 1 ); // короткий мувинг 4
   mas_p= iMA ( NULL , 0 ,MovingPeriod,MovingShift, MODE_SMA , PRICE_CLOSE , 2 ); // динный мувинг 12
   maf_p= iMA ( NULL , 0 ,MovingPeriod1,MovingShift, MODE_SMA , PRICE_CLOSE , 2 ); // короткий мувинг 4
   Atr = iATR ( NULL , 0 ,AtrPer, 0 );
 //---- Условие продажи
   if (maf<mas && maf_p>=mas_p)  
     {
      res= OrderSend ( Symbol (),OP_SELL,LotsOptimized(),Bid, 3 , 0 , 0 , "" ,MAGICMA, 0 , Red );
       if (SndMl == True && res != - 1 ) 
         {
         sHeaderLetter = "Operation SELL by" + Symbol ()+ "" ;
         sBodyLetter = "Order Sell by" + Symbol () + " at " + DoubleToStr (Bid, 4 )+ ", and set stop/loss at " + DoubleToStr (Ask+Atr, 4 )+ "" ;
         sndMessage(sHeaderLetter, sBodyLetter);
         }
       return ;
     }
//---- Условие покупки
   if (maf>mas && maf_p<=mas_p)  
     {
      res= OrderSend ( Symbol (),OP_BUY,LotsOptimized(),Ask, 3 , 0 , 0 , "" ,MAGICMA, 0 , Blue );
       if ( SndMl == True && res != - 1 )
      { 
      sHeaderLetter = "Operation BUY at" + Symbol ()+ "" ;
      sBodyLetter = "Order Buy at" + Symbol () + " for " + DoubleToStr (Ask, 4 )+ ", and set stop/loss at " + DoubleToStr (Bid-Atr, 4 )+ "" ;
      sndMessage(sHeaderLetter, sBodyLetter);
      }
       return ;
     }
//----
  }
//+------------------------------------------------------------------+
//| ПРоверка для закрытия открытой позиции                           |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   string sHeaderLetter;
   string sBodyLetter;
   bool rtvl;
//---- 
   if (Volume[ 0 ]> 1 ) return ;
//----  
   mas= iMA ( NULL , 0 ,MovingPeriod,MovingShift, MODE_SMA , PRICE_CLOSE , 1 ); // динный мувинг 12
   maf= iMA ( NULL , 0 ,MovingPeriod1,MovingShift, MODE_SMA , PRICE_CLOSE , 1 ); // короткий мувинг 4
   mas_p= iMA ( NULL , 0 ,MovingPeriod,MovingShift, MODE_SMA , PRICE_CLOSE , 2 ); // динный мувинг 12
   maf_p= iMA ( NULL , 0 ,MovingPeriod1,MovingShift, MODE_SMA , PRICE_CLOSE , 2 ); // короткий мувинг 4
//----
   for ( int i= 0 ;i< OrdersTotal ();i++)
     {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)==false)         break ;
       if ( OrderMagicNumber ()!=MAGICMA || OrderSymbol ()!= Symbol ()) continue ;
       //----  
       if ( OrderType ()==OP_BUY)
        {
         if (maf<mas && maf_p>=mas_p) rtvl= OrderClose ( OrderTicket (), OrderLots (),Bid, 3 , Lime );
             if ( SndMl == True && rtvl != False )
            {
            sHeaderLetter = "Operation CLOSE BUY at" + Symbol ()+ "" ;
            sBodyLetter = "Close order Buy at" + Symbol () + " for " + DoubleToStr (Bid, 4 )+ ", and finish this Trade" ;
            sndMessage(sHeaderLetter, sBodyLetter);
            }
         break ;
        }
       if ( OrderType ()==OP_SELL)
        {
         if (maf>mas && maf_p<=mas_p) rtvl= OrderClose ( OrderTicket (), OrderLots (),Ask, 3 , Lime );
         if ( SndMl == True && rtvl != False ) 
         {
         sHeaderLetter = "Operation CLOSE SELL at" + Symbol ()+ "" ;
         sBodyLetter = "Close order Sell at" + Symbol () + " for " + DoubleToStr (Ask, 4 )+ ", and finish this Trade" ;
         sndMessage(sHeaderLetter, sBodyLetter);
         }
         break ;
        }
     }
//----
  }
  
//--------------------------------------------------------------------
// функция отправки ссобщения об отрытии или закрытии позиции
//--------------------------------------------------------------------
void sndMessage( string HeaderLetter, string BodyLetter)
{
   int RetVal;
   SendMail ( HeaderLetter, BodyLetter );
   RetVal = GetLastError ();
   if (RetVal!= ERR_NO_MQLERROR) Print ( "Ошибка, сообщение не отправлено: " , ErrorDescription(RetVal));
}
//+------------------------------------------------------------------+
//| Майн функция                                                     |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if ( Bars < 25 || IsTradeAllowed ()==false) return ;
//---- calculate open orders by current symbol
   if (CalculateCurrentOrders( Symbol ())== 0 ) CheckForOpen();
   else                                     CheckForClose();
//----
  }
//+------------------------------------------------------------------+
Teşekkür ederim!
 

Güzel gün. Standart Se ndMail fonksiyonu ile ilgili bir soru... Fonksiyonun nasıl çalıştığını anlamak için aşağıdaki scripti yazdım:

 //+------------------------------------------------------------------+
//|                                             функция_SendMail.mq4 |
//|                      Copyright © 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//+------------------------------------------------------------------+

SendMail ( "Скрипт Функция_SendMail" , "Webmoney - идите в жопу!!!!" );
Alert ( GetLastError ());
   
//+------------------------------------------------------------------+   
   return ( 0 );
  }
//+------------------------------------------------------------------+

Bir istemci terminal penceresinde başlatıldığında, günlükte bir hata görünür:

Aynı zamanda, ayarlarda ( hizmet istemci terminalinin menüsü -> Ayarlar -> Posta sekmesi) aşağıdaki parametreler ayarlanır:

SMTP alanlarındaki üç nokta yerine oturum açma ve Kimden mesaj göndermek istediğim posta kutusunun adı ve Kime alanında mesajı göndermek istediğim posta kutusunun adı.

Bu durumda SMTP Sunucusu alanında belirtilen port numarası gerçekten 25:

Not: Ekran görüntüsü Posta sunucusundaki Yardım bölümünden alınmıştır. Ru .

Soru : Bu hata nedir ve nasıl kurtulur? Derleyici hataları algılamaz ve GetLastError () işlevi 0 değerini döndürür.

s. _ S. _ forumu kirletmemek adına şimdiden teşekkürler

 
7777877 :

Güzel gün. Standart Se ndMail fonksiyonu ile ilgili bir soru... Fonksiyonun nasıl çalıştığını anlamak için aşağıdaki scripti yazdım:

Bir istemci terminal penceresinde başlatıldığında, günlükte bir hata görünür:

Aynı zamanda, ayarlarda ( hizmet istemci terminalinin menüsü -> Ayarlar -> Posta sekmesi) aşağıdaki parametreler ayarlanır:

SMTP alanlarındaki üç nokta yerine oturum açma ve Kimden mesaj göndermek istediğim posta kutusunun adı ve Kime alanında mesajı göndermek istediğim posta kutusunun adı.

Bu durumda SMTP Sunucusu alanında belirtilen port numarası gerçekten 25:

Not: Ekran görüntüsü Posta sunucusundaki Yardım bölümünden alınmıştır. Ru .

Soru : Bu hata nedir ve nasıl kurtulur? Derleyici hataları algılamaz ve GetLastError () işlevi 0 değerini döndürür.

s. _ S. _ forumu kirletmemek adına şimdiden teşekkürler

Bağlantı noktasına ve şifrelemeye bakın. Belki 2525 koyulmalı?
 

yardım edin lütfen

işte kod


 //-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0 ; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0 ;   // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0 ,
Time_at_History_Previos = 0 ;     
 
 if ( OrdersHistoryTotal () != 0 )
   {
     for ( int counter = OrdersHistoryTotal ()- 1 ; counter >= 0 ; counter--)
      {
       OrderSelect (counter, SELECT_BY_POS, MODE_HISTORY);
       if ( OrderSymbol () == Symbol () && OrderMagicNumber () == MagicNumber)
         {
           if ( OrderType () == OP_BUY || OrderType () == OP_SELL)
            {
             if ( OrderProfit () < 0 ) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit ();
                 Sum_Loss=Sum_Loss+lastLoss;   // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime ();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if (Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                 //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                 if ( OrderProfit () >= 0 )
                   break ;
               }
            }
         }
      }
   }

if (Sum_Loss < 0.0 ) { // Имеем убыток по закрытым позам
double money = Lots;
   BuyLots = GetBuyLotsSum();
        SellLots = GetSellLotsSum();
         if (BuyLots  > SellLots)money = BuyLots * 10 ;
         if (BuyLots  < SellLots)money = SellLots * 10 ;
   if ((( AccountEquity () + Sum_Loss + (Sum_Loss / money)) >= AccountBalance ()) && (((totalSell > 0 ) && (totalBuy < 1 )) || ((totalSell < 1 ) && (totalBuy > 0 )))) { // Достигли безубытка
     // Здесь какой-то код, который необходимо выполнить при достижении безубытка
        CloseAllBuy();
           CloseAllSell();
           Sum_Loss = 0.0 ;
           

Anlaşma negatifte kapatıldığında, bir döngü açılacak ve bir sonraki sipariş sıfırdan fazla, yani pozitif bir bakiye, ancak negatiften daha az kapanırsa, o zaman bir ekleyeceğimiz hiçbir şey yapamam. artı eksi ve zaten daha küçük olan yeni bir negatif değer elde ederiz.

 if ( OrderProfit () >= 0 && Sum_Loss < 0.0 )
                   double lastLoss_two = OrderProfit ();
                 Sum_Loss=Sum_Loss+lastLoss_two;   // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime ();
               }

ve bir sinyalde negatiften fazlaysa, siparişi kapatırız ve döngüyü baştan başlatırız.


Durum şu ki, bu kod bir anlaşmayı kayıpla kapattığında, eksi bakiyeyi hatırlar ve bir artı ile bir anlaşmayı kapattığında ve aynı zamanda artı bakiyeden daha az olduğunda, Sum_Loss'u sıfırlar ve ihtiyacım var sıfırlamak için değil, biçmek için.

yani, şimdi şöyle çalışıyor:

kapalı bir emri kontrol eder, eğer kapalı bir emrin karı sıfırdan azsa, bu kar Sum_Loss'a eklenir ve açık bir anlaşmanın karı Sum_Loss'u geçene (daha fazla olacak) kadar, anlaşmaya ulaşıldığında, anlaşma kapatılır ve Sum_Loss sıfırlanır ve döngü yeniden başlar.

Ve ihtiyacım var:

emir kırmızı ile kapandı, negatif karı Sum_Loss'a eklendi, sonra bir sonraki işlem pozitif bir karla kapandıysa, Sum_Loss miktarını karlı kardan alınan miktar kadar düşürürüz, bu da bir sonraki açık sipariş Sum_Loss'un alacağı anlamına gelir daha küçük bir miktarla ve siparişlerden elde edilen kâr Sum_Loss'tan daha büyük olana kadar böyle devam eder ve ardından Sum_Loss'u sıfırlar ve yeni bir döngü başlatırız.

toplam_kayıp = 0;

1. kapalı emir: kar (-50) < 0

Sum_Loss + kar (Sum_Loss + (-50))

Toplam_Kayıp = -50;

2. kapalı emir: kar(+40) > 0 ve Sum_Loss < 0

Sum_Loss + kar (Sum_Loss + 40)

Toplam_Kayıp = -10
 
7777877 :

Güzel gün. Standart Se ndMail fonksiyonu ile ilgili bir soru... Fonksiyonun nasıl çalıştığını anlamak için aşağıdaki scripti yazdım:

Bir istemci terminal penceresinde başlatıldığında, günlükte bir hata görünür:

Aynı zamanda, ayarlarda ( hizmet istemci terminalinin menüsü -> Ayarlar -> Posta sekmesi) aşağıdaki parametreler ayarlanır:

SMTP alanlarındaki üç nokta yerine oturum açma ve Kimden mesaj göndermek istediğim posta kutusunun adı ve Kime alanında mesajı göndermek istediğim posta kutusunun adı.

Bu durumda SMTP Sunucusu alanında belirtilen port numarası gerçekten 25:

Not: Ekran görüntüsü Posta sunucusundaki Yardım bölümünden alınmıştır. Ru .

Soru : Bu hata nedir ve nasıl kurtulur? Derleyici hataları algılamaz ve GetLastError () işlevi 0 değerini döndürür.

s. _ S. _ forumu kirletmemek adına şimdiden teşekkürler

Yardım

sunucu smtp.mail.ru:25 gerçekten işe yarıyor

 
YOUNGA :

Yardım

sunucu smtp.mail.ru:25 gerçekten işe yarıyor

Kimden, kiminle eşleştiği test için bir giriş yaptım

Güvenlik duvarları müdahale ediyor olabilir mi?

Ah bir milyon için kahrolası tavsiye - terminali aşırı yükle!


 

iyi insanlara yardım et

X fiyatına bekleyen bir emir veriyorum. Emir, Y fiyatından bir piyasa emrine dönüştürülür. Bekleyen bir emrin hangi fiyattan verildiğini (günlükte ... orada veya ) bir yerde bulmak mümkün mü yoksa kendi dizinizi yazmanız gerekecek mi?

 

İyi akşamlar!

Lütfen hatanın olası bir kaynağını önerin. Dile yeni giriyorum, bu yüzden biraz takıldım.

EA kodundaki görev, .scv dosyasındaki verileri (satır başına iki değer, 400 satır) okumak ve bir diziye yazmaktır.

 double signals_array[ 400 ][ 2 ];

int init()
  {

   int Handle;
      Handle= FileOpen ( "Signals.csv" , FILE_CSV | FILE_READ , ";" ); // Открытие файла
   if (Handle< 0 )                         // Неудача при открытии файла
      {
       if ( GetLastError ()== 4103 )         // Если файла не существует,..
         Alert ( "Нет файла" ); //.. извещаем трейдера 
       else                              // При любой другой ошибке..
         Alert ( "Ошибка при открытии файла" ); //..такое сообщ
         PlaySound ( "Bzrrr.wav" );           // Звуковое сопровождение
         return ;                           // Выход из start()      
      }

   for ( int i = 0 ; i < 400 ; i++)
      {
       for ( int j = 0 ; j < 2 ; j++)
         signals_array[i][j] = StrToDouble ( FileReadString (Handle));
      }

Alert (signals_array[ 120 ][ 0 ], "; " ,signals_array[ 0 ][ 1 ], " OK!" );
//----
   return ( 0 );
  }

Sorun şu: Bir grafik üzerine Expert Advisor atarsanız diziden doğru değerlerle uyarı çıkıyor ancak Expert Advisor'ı test etmeye çalışırsanız log'da "Dosya yok" uyarısı veriyor. . Yani dosyaya erişilemiyor gibi görünüyor (inanılmaz olsa da) ve diziye değerler yazıyor (ki bu başka bir uyarı tarafından onaylanıyor), ancak dosyayı bulma konusunda takılıp kalıyor. kayıt. Kafası karışmış. Aşağıdaki ekran görüntüsü.

 

alexeymosc :

Sorun şu: Bir grafik üzerine Expert Advisor atarsanız diziden doğru değerlerle uyarı çıkıyor ancak Expert Advisor'ı test etmeye çalışırsanız log'da "Dosya yok" uyarısı veriyor. . Yani dosyaya erişilemiyor gibi görünüyor (inanılmaz olsa da) ve diziye değerler yazıyor (ki bu da başka bir uyarı tarafından onaylanıyor), ancak loga göre dosyayı bulma konusunda takılıyor. . Kafası karışmış.


Test cihazında ve çizelgede dosyalar farklı dizinlere yazılır ve okunur:

  1. MetaTrader 4\tester\uzmanlar\dosyalar
  2. MetaTrader 4\uzmanlar\dosyalar
 
alexeymosc :

İyi akşamlar!

Lütfen hatanın olası bir kaynağını önerin. Dile yeni giriyorum, bu yüzden biraz takıldım.

EA kodundaki görev, .scv dosyasındaki verileri (satır başına iki değer, 400 satır) okumak ve bir diziye yazmaktır.

Sorun şu: Bir grafik üzerine Expert Advisor atarsanız diziden doğru değerlerle uyarı çıkıyor ancak Expert Advisor'ı test etmeye çalışırsanız log'da "Dosya yok" uyarısı veriyor. . Yani dosyaya erişilemiyor gibi görünüyor (inanılmaz olsa da) ve diziye değerler yazıyor (ki bu başka bir uyarı tarafından onaylanıyor), ancak dosyayı bulma konusunda takılıp kalıyor. kayıt. Kafası karışmış. Aşağıdaki ekran görüntüsü.

Dosya açıksa, onunla çalışırken bir hata alınsa bile kapatılmalıdır. Şimdiye kadar herhangi bir hata görmüyorum.

Şu şekilde okunabilir:

signals_array[i][j] = FileReadDouble (Handle);