MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 256

 
Alexey Viktorov :

나는 내 자신의 메모리 칩에 대해 이야기하고 있었다. :)))

코드를 작성할 때 쉽게 다시 확인하고, 명확하게 하고, 해야 하는 대로 수행하고, 다시 잊어버릴 수 있는 그런 사소한 일들을 기억하지 못한다는 사실.

알았습니다! :)
 
Artyom Trishkin :
나는 사람들이 종종 후행 또는 손익분기 함수를 묻는 것을 알아차렸습니다. 여기에 가격 차트에 선을 그리는 함수(예: MA 또는 포물선)에 전달된 일부 표시기의 값에 따라 스탑을 주어진 손익분기 수준으로 이동하고 포지션 스탑을 추적하는 스텁 함수를 추가했습니다.

#property strict // в самое начало кода вашей программы (если нету там ещё)


// Функцию - за пределы остальных функций программы
//+------------------------------------------------------------------+
//| Трейлинг по значению + перенос стопа на уровень безубытка        |
//+------------------------------------------------------------------+
void TrailingByLevel( string symbol_name,           // Имя символа
                     int magic_number,             // Magic ордера
                     double level_of_trail,         // Уровень, на который ставим стоп (например МА или Parabolic SAR)
                     int trailing_start,           // Профит в пунктах для старта трала
                     int trailing_step,             // Шаг трала в пунктах
                     int trailing_stop,             // Отступ стоплосс от уровня МА или SAR в пунктах
                     int profit_for_breakeven= 15 ,   // Профит в пунктах для переноса стопа в безубыток
                     int breakeven_level= 5 ,         // Уровень безубытка в пунктах
                     bool use_trail= true ,           // Флаг использования трала
                     bool use_breakeven= false        // Флаг использования безубытка
                     )
   {
   int lv=StopLevel(symbol_name)+ 1 ;                 // Получаем значение Stop Level по символу + 1 пункт (из отдельной функции)
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS )) {
         if ( OrderMagicNumber ()!=magic_number)   continue ;         //Если Магик не наш - идем к следующему ордеру
         if ( OrderSymbol ()!=symbol_name)         continue ;         //Если Символ не наш - идем к следующему ордеру
         //--- покупки
         if ( OrderType ()== OP_BUY ) {
             int     digits=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
             double point=( SymbolInfoDouble (symbol_name, SYMBOL_POINT ));
             double pb= SymbolInfoDouble (symbol_name, SYMBOL_BID );
             double profit=pb- OrderOpenPrice ();                     // Профит позиции в цене (без комиссий и свопов)
             //--- безубыток
             if (use_breakeven) {
               //--- если профит в цене больше заданного
               if (profit>=profit_for_breakeven*point) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble ( OrderOpenPrice ()+breakeven_level*point,digits);
                   if (pb-lv*point>sl && OrderStopLoss ()<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) return ;
                  }
               }
             //--- трал
             if (use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if (profit>=trailing_start*point || trailing_start== EMPTY ) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble (level_of_trail-trailing_stop*point,digits);   // вычисляем новый уровень стоплосс по значению, переданному в функцию
                   //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                   if (pb-lv*point>sl && OrderStopLoss ()+trailing_step*point<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) return ;
                  }
               }
            }

         //--- Продажи
         if ( OrderType ()== OP_SELL ) {
             int     digits=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
             double point=( SymbolInfoDouble (symbol_name, SYMBOL_POINT ));
             double pa= SymbolInfoDouble (symbol_name, SYMBOL_ASK );
             double profit= OrderOpenPrice ()-pa;                     // Профит позиции в цене (без комиссий и свопов)
             //--- безубыток
             if (use_breakeven) {
               //--- если профит в цене больше заданного
               if (profit>=profit_for_breakeven*point) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble ( OrderOpenPrice ()-breakeven_level*point,digits);
                   if (pa+lv*point<sl && ( OrderStopLoss ()>sl || OrderStopLoss ()== 0 )) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) break ;
                  }
               }
             //--- трал
             if (use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if (profit>=trailing_start*point || trailing_start== EMPTY ) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble (level_of_trail+trailing_stop*point,digits);   // вычисляем новый уровень стоплосс по значению, переданному в функцию
                   //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                   if (pa+lv*point<sl && ( OrderStopLoss ()-trailing_step*point>sl || OrderStopLoss ()== 0 )) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) break ;
                  }
               }
            }
         }
      }
}
//+------------------------------------------------------------------+
int StopLevel( string symbol_name) {
   int sp=( int ) SymbolInfoInteger (symbol_name, SYMBOL_SPREAD );
   int lv=( int ) SymbolInfoInteger (symbol_name, SYMBOL_TRADE_STOPS_LEVEL );
   return ((lv== 0 )?sp* 2 :lv);
   }
//+------------------------------------------------------------------+
일반적으로 무언가를 ezli - 물어보십시오. 또는 수정

Expert Advisor를 개선하는 데 도움을 줄 수 있습니까? 나는 스탑을 배치하는 Expert Advisor가 있지만 스탑 손실을 끄는 방법을 모릅니다. 전혀 이해가 안가는데 전문가의 도움을 바랍니다.

 

배열 요소 의 가중치를 결정하는 함수가 필요합니다. 주어진 요소에 가까운(가까운) 다른 요소의 수가 많을수록 가중치가 커집니다. 아마도 그러한 기능이 이미 존재합니다. 샘플에 있는 원소의 농도로 샘플에 있는 원소의 무게를 결정하는 것과 같은 것입니다. 고맙습니다.

 

안녕하세요! MQL4 테스터에서 한 번만 반복한 다음 중지 하는 이유를 알 수 없습니까? TimeCurrent() 가 업데이트되지 않습니까? 어떻게 업데이트합니까? 다중 통화 고문은 틱이 아니라 매초 또는 초당 5 번 이상 작동해야합니다.

   int start()                                     // Спец. функция start
  {
     while (! IsStopped ())
     {
       RefreshRates ();
       if ( RefreshRates ()== true ||MyTimer( 1 ))
        {
         код советника
        }  
     }
     return ( 0 );
  }


bool MyTimer( int Delay) //функция для работы советника по заданому интервалу времени, а не по тикам
{
   RefreshRates ();
   static datetime Time1, Time2;
   bool Result = False ;
  
   if ( MathMod ( TimeSeconds ( TimeCurrent ()), Delay) == 0.0 )
  {
    Time1 = TimeCurrent ();
     if (Time1 != Time2)
    {  
      Time2 = Time1;
      Result = True ;
    }
  }
   return (Result);
}
 
Jenya77769 :

안녕하세요! MQL4 테스터에서 한 번만 반복한 다음 중지 하는 이유를 알 수 없습니까? TimeCurrent()가 업데이트되지 않습니까? 어떻게 업데이트합니까? 다중 통화 고문은 틱이 아니라 매초 또는 초당 5 번 이상 작동해야합니다.

고문으로 무언가를 시작하고 있습니까? 즉, 전문가 디렉토리에서??

Expert Advisors의 경우 start() 함수(이전 이름, 최신 OnTick)는 각 틱 에서 시작됩니다. 즉, 틱이 끝나면 종료되어야 합니다. 그리고 당신은 그것을 zatsiklina 가지고 있습니다

 
Maxim Kuznetsov :

고문으로 무언가를 시작하고 있습니까? 즉, 전문가 디렉토리에서??

Expert Advisors의 경우 start() 함수(이전 이름, 최신 OnTick)는 각 틱 에서 시작됩니다. 즉, 틱이 끝나면 종료되어야 합니다. 그리고 당신은 그것을 zatsiklina 가지고 있습니다

여기 튜토리얼에서는 이것이 허용되며 루프된 "시작" 기능이 있는 예가 있습니다.

https://book.mql4.com/en/special/index

О сложных программах - Учебник по MQL4
О сложных программах - Учебник по MQL4
  • book.mql4.com
О сложных программах - Учебник по MQL4
 
Jenya77769 : 여기 튜토리얼에서 이것이 허용되며 루프된 "시작" 기능이 있는 예가 있습니다.

물론 루프할 수 있습니다. 그러나 다음 TIC까지 놓아주는 것이 좋습니다. 그렇지 않으면 TIC가 손실됩니다. 그는 필요합니까?

 
LRA :

물론 루프할 수 있습니다. 그러나 다음 TIC까지 놓아주는 것이 좋습니다. 그렇지 않으면 TIC가 손실됩니다. 그는 필요합니까?


왜 졌어? 새 틱에 대한 정보 는 RefreshRates () 함수를 사용하여 얻을 수 있습니다. 무한 루프에서 바로

 
Jenya77769 : 왜 졌나요? 새 틱에 대한 정보 는 RefreshRates () 함수를 사용하여 얻을 수 있습니다. 무한 루프에서 바로

새로 고침 () 함수 그냥 확인합니다. 데이터가 업데이트된 경우 true를 반환합니다. 이 작업을 수행할 수 있습니다. while(! RefreshRates ()); - 대기 틱

 
LRA :

새로 고침 () 함수 그냥 확인합니다 . 데이터가 업데이트된 경우 true를 반환합니다. 이 작업을 수행할 수 있습니다. while(! RefreshRates ()); - 대기 틱

업데이트 (사람들을 속이지 마십시오)하고 업데이트에 대한 성공 또는 실패 플래그를 반환합니다.

SymbolInfoDouble() , SymbolInfoTick() 을 사용하여 데이터를 얻으면 그것 없이 할 수 있습니다.