[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 4. - 페이지 392

 
안녕하세요! 프로, 알려주세요! 비율이 꺼지면 EA가 같은 막대에서 반대 방향으로 새로운 비율을 취하도록 EA에 쓰는 방법(예: "뒤집기"). 나는 "새로운 막대가 열릴 때" 모델에 따라 테스트합니다. 예를 들어, 고문:
 //+------------------------------------------------------------------+
//|                                                      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();
//----
  }
//+------------------------------------------------------------------+
고맙습니다!
 

안녕하세요. 표준 SendMail 함수 에 대한 질문 ... 함수가 어떻게 작동하는지 이해하기 위해 다음 스크립트를 작성했습니다.

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

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

클라이언트 터미널 창에서 시작하면 로그에 오류가 나타납니다.

동시에 설정(클라이언트 터미널 서비스 메뉴 -> 설정 -> 메일 탭)에서 다음 매개변수가 설정됩니다.

SMTP 필드의 점 세 개 대신에 로그인이 있고 From은 메시지를 보내려는 사서함의 이름이며 To 필드는 메시지를 보낼 사서함의 이름입니다.

이 경우 SMTP 서버 필드 에 지정된 포트 번호 정말 25:

참고: 스크린샷은 메일 서버의 도움말에서 찍은 것입니다. .

질문 : 이 오류는 무엇이며 어떻게 제거합니까? 컴파일러는 오류를 감지하지 않으며 GetLastError () 함수는 값 0을 반환합니다.

피. _ 에스 _ 포럼을 어지럽히지 않기 위해 답변에 미리 감사드립니다.

 
7777877 :

안녕하세요. 표준 SendMail 함수 에 대한 질문 ... 함수가 어떻게 작동하는지 이해하기 위해 다음 스크립트를 작성했습니다.

클라이언트 터미널 창에서 시작하면 로그에 오류가 나타납니다.

동시에 설정(클라이언트 터미널 서비스 메뉴 -> 설정 -> 메일 탭)에서 다음 매개변수가 설정됩니다.

SMTP 필드의 점 세 개 대신에 로그인이 있고 From은 메시지를 보내려는 사서함의 이름이며 To 필드는 메시지를 보낼 사서함의 이름입니다.

이 경우 SMTP 서버 필드 에 지정된 포트 번호 정말 25:

참고: 스크린샷은 메일 서버의 도움말에서 찍은 것입니다. .

질문 : 이 오류는 무엇이며 어떻게 제거합니까? 컴파일러는 오류를 감지하지 않으며 GetLastError () 함수는 값 0을 반환합니다.

피. _ 에스 _ 포럼을 어지럽히지 않기 위해 답변에 미리 감사드립니다.

포트와 암호화를 살펴보십시오. 아마도 2525를 넣어야 할까요?
 

도와주세요.

여기 코드가 있습니다


 //-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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 ;
           

거래가 음수에서 마감되었을 때 사이클이 열리고 다음 주문이 0보다 크거나, 즉 양수 잔액이지만 음수보다 작으면 다음 주문이 닫히도록 아무 것도 할 수 없습니다. 더하기 음수, 우리는 이미 더 작은 새로운 음수 값을 얻습니다.

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

신호에서 음수보다 크면 주문을 닫고 처음부터 사이클을 시작합니다.


상황은 이 코드가 손실로 거래를 마감할 때 마이너스 잔액을 기억하고 플러스로 거래를 마감할 때 플러스가 잔액보다 작을 때 Sum_Loss를 재설정하고 필요한 재설정하는 것이 아니라 깎는 것입니다.

즉, 이제 다음과 같이 작동합니다.

마감된 주문을 확인하고, 마감된 주문의 이익이 0보다 작으면 이 이익이 Sum_Loss에 추가되고, 미결 거래의 이익이 Sum_Loss를 초과할 때까지 계속됩니다. 닫히고 Sum_Loss가 0으로 재설정되고 주기가 다시 시작됩니다.

그리고 나는 필요합니다:

빨간색으로 마감된 주문은 음수 이익이 Sum_Loss에 추가되었습니다. 다음 거래가 양수 이익으로 마감되면 Sum_Loss 금액을 수익성 있는 이익에서 받은 금액만큼 줄입니다. 더 적은 양으로 주문의 이익이 Sum_Loss보다 클 때까지 계속해서 Sum_Loss를 재설정하고 새로운 주기를 시작합니다.

합계 손실 = 0;

첫 번째 청산 주문: 이익 (-50) < 0

Sum_Loss + 이익 (Sum_Loss + (-50))

Sum_Loss = -50;

두 번째 청산 주문: 이익(+40) > 0 및 Sum_Loss < 0

Sum_Loss + 이익 (Sum_Loss + 40)

합계_손실 = -10
 
7777877 :

안녕하세요. 표준 SendMail 함수 에 대한 질문 ... 함수가 어떻게 작동하는지 이해하기 위해 다음 스크립트를 작성했습니다.

클라이언트 터미널 창에서 시작하면 로그에 오류가 나타납니다.

동시에 설정(클라이언트 터미널 서비스 메뉴 -> 설정 -> 메일 탭)에서 다음 매개변수가 설정됩니다.

SMTP 필드의 점 세 개 대신에 로그인이 있고 From은 메시지를 보내려는 사서함의 이름이며 To 필드는 메시지를 보낼 사서함의 이름입니다.

이 경우 SMTP 서버 필드 에 지정된 포트 번호 정말 25:

참고: 스크린샷은 메일 서버의 도움말에서 찍은 것입니다. .

질문 : 이 오류는 무엇이며 어떻게 제거합니까? 컴파일러는 오류를 감지하지 않으며 GetLastError () 함수는 값 0을 반환합니다.

피. _ 에스 _ 포럼을 어지럽히지 않기 위해 답변에 미리 감사드립니다.

돕다

서버 smtp.mail.ru:25가 실제로 작동합니다.

 
YOUNGA :

돕다

서버 smtp.mail.ru:25가 실제로 작동합니다.

테스트에 대한 로그인이 있습니다. 누구와 일치하는지

방화벽이 간섭하고 있는 것은 아닐까?

백만에 대한 오 빌어먹을 조언 - 터미널에 과부하가 걸립니다!


 

좋은 사람들을 도와주세요

나는 x의 가격에 보류 주문 을 넣습니다. 주문은 가격 Y의 시장 주문으로 변환됩니다. 보류 중인 주문이 어느 가격에 배치되었는지 어딘가에서 찾을 수 있습니까(로그에서 ...거기 또는 ) 아니면 고유한 배열을 작성해야 할 것입니다

 

좋은 저녁이에요!

오류의 가능한 원인을 제안하십시오. 나는 단지 언어에 빠져들고 있어서 조금 막혔습니다.

EA 코드의 작업은 .scv 파일에서 데이터를 읽고(한 줄에 두 개의 값, 400줄) 배열에 쓰는 것입니다.

 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 );
  }

문제는 차트에 Expert Advisor를 던지면 어레이의 올바른 값으로 경고를 표시하지만 Expert Advisor를 테스트하려고 하면 로그에 "파일 없음" 경고가 표시된다는 것입니다. . 즉, 파일에 액세스할 수 없는 것처럼 보이고(믿을 수 없지만) 배열에 값을 쓰지만(또 다른 경고로 확인됨) 통나무. 혼란스러운. 아래 스크린샷.

 

alexeymosc :

문제는 차트에 Expert Advisor를 던지면 어레이의 올바른 값으로 경고를 표시하지만 Expert Advisor를 테스트하려고 하면 로그에 "파일 없음" 경고가 표시된다는 것입니다. . 즉, 파일에 액세스할 수 없는 것 같고(믿을 수 없지만) 배열에 값을 쓰지만(다른 경고로 확인됨) 로그에 따라 파일을 찾는 데 멈춥니다. . 혼란스러운.


테스터와 차트에서 파일은 다른 디렉토리에서 작성되고 읽힙니다.

  1. MetaTrader 4\테스터\전문가\파일
  2. MetaTrader 4\experts\files
 
alexeymosc :

좋은 저녁이에요!

오류의 가능한 원인을 제안하십시오. 나는 단지 언어에 빠져들고 있어서 조금 막혔습니다.

EA 코드의 작업은 .scv 파일에서 데이터를 읽고(한 줄에 두 개의 값, 400줄) 배열에 쓰는 것입니다.

문제는 차트에 Expert Advisor를 던지면 어레이의 올바른 값으로 경고를 표시하지만 Expert Advisor를 테스트하려고 하면 로그에 "파일 없음" 경고가 표시된다는 것입니다. . 즉, 파일에 액세스할 수 없는 것처럼 보이고(믿을 수 없지만) 배열에 값을 쓰지만(또 다른 경고로 확인됨) 통나무. 혼란스러운. 아래 스크린샷.

파일이 열려 있으면 작업하는 동안 오류가 수신되더라도 파일을 닫아야 합니다. 지금까지 나는 어떤 오류도 보지 못했습니다.

다음과 같이 읽을 수 있습니다.

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