로봇 만들기 - 페이지 8

 

매우 감사합니다!!!

현재 차트에 ZigZagColor 표시기를 생성하고 Expert Advisor를 닫은 후 삭제하는 프로그램 코드는 다음과 같습니다.

EA 초기화 블록에서

 //--- create handle of the indicator iCustom
   handle_iCustom= iCustom (m_symbol.Name(), Period (), "Examples\\ZigzagColor" ,
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd ( ChartID (), 0 ,handle_iCustom);

EA 초기화 해제 블록에서

( 이 코드를 사용할 사람들을 위한 주의 ! 이 코드 버전은 중간이며 표시기 설정 Inp_ZZ_Depth=80 ; Inp_ZZ_Deviation=20 ; Inp_ZZ_Backstep=0 ; 다른 설정에서는 표시기가 삭제되지 않습니다! 초기화 해제 블록의 다른 설정과 함께 삭제할 표시기 의 경우 80,20,0 대신 지정해야 합니다.)

 //---
   ChartIndicatorDelete ( 0 , 0 , "ZigZag(80,20,0)" );

이제 표시기 설정이 변경되면 삭제되도록 만드는 방법을 이해해야 합니다. 이 옵션을 시도했습니다.

 //---
   ChartIndicatorDelete ( 0 , 0 , "ZigZag(" +Inp_ZZ_Depth+ "," +Inp_ZZ_Deviation+ "," +Inp_ZZ_Backstep+ ")" );

이 옵션을 사용하면 모든 설정에 대해 표시기가 제거 되지만 어드바이저를 컴파일할 때 편집기는 숫자에서 문자열로의 암시적 변환 에 대해 3개의 경고를 씁니다.

implicit conversion from 'number' to 'string'   ZigZag_Fibonacci_(M1).mq5       230     38

나는 이것이 "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+", "+Inp_ZZ_Backstep+" 값에 관한 모든 것이라고 생각합니다. 일반적으로 MQL5 프로그래밍 언어 를 더 공부해야 합니다.

다시 한 번 응원해주신 모든 분들께 감사드립니다!!!

안부 인사를 전합니다. 블라디미르.

 
MrBrooklin :

매우 감사합니다!!!

현재 차트에 ZigZagColor 표시기를 생성하고 Expert Advisor를 닫은 후 이를 제거하는 최종 코드는 다음과 같습니다.

EA 초기화 블록에서

EA 초기화 해제 블록에서

( 이 코드를 사용할 사람들을 위한 주의 ! 이 코드 버전은 중간이며 표시기 설정 Inp_ZZ_Depth=80 ; Inp_ZZ_Deviation=20 ; Inp_ZZ_Backstep=0 ; 다른 설정에서는 표시기가 삭제되지 않습니다! 초기화 해제 블록의 다른 설정과 함께 삭제할 표시기 의 경우 80,20,0 대신 지정해야 합니다.)

이제 표시기 설정이 변경되면 삭제되도록 만드는 방법을 이해해야 합니다. 이 옵션을 시도했습니다.

이 옵션을 사용하면 모든 설정에 대해 표시기가 제거 되지만 어드바이저를 컴파일할 때 편집기는 숫자에서 문자열로의 암시적 변환 에 대해 3개의 경고를 씁니다.

나는 이것이 "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+", "+Inp_ZZ_Backstep+" 값에 관한 모든 것이라고 생각합니다. 일반적으로 MQL5 프로그래밍 언어 를 더 공부해야 합니다.

다시 한 번, 여러분의 지원에 감사드립니다!!!

안부 인사를 전합니다. 블라디미르.

 ChartIndicatorDelete ( 0 , 0 , "ZigZag(" +( string )Inp_ZZ_Depth+ "," +( string )Inp_ZZ_Deviation+ "," +( string )Inp_ZZ_Backstep+ ")" );

암시적 유형 캐스팅에 대한 경고입니다. 엄격한(엄격한) 실행의 경우 암시적 캐스트는 경고를 제공합니다.

유형을 명시적으로 캐스팅해야 합니다. 그리고 MT5에는 항상 엄격한 실행이 있습니다. MT4에서는 #property strict 속성을 지정하지 않고 선택할 수 있습니다.

 
SanAlex :

나 스스로 독학을 하고 있다 - 그리고 나는 사용 가능한 코드에서 복사한다 - 문제는 내가 조각하는 방법을 설명할 수 없다는 것입니다!? - 안의 무언가가 눈을 멀게 하는 방법을 알려줍니다.

----------------------------------

나는 내가 눈을 멀게 한 것을 알고 있습니다. 거기에는 충분하지 않습니다. 라인에 대한 또 다른 트롤입니다.

트롤 추가

 input string    t0= "---- Trailing Line:      -----" ;               //
input ushort    InpObjTrailingStop           = 0 ;                 // Obj: Trailing Stop (distance from price to object, in pips)
input ushort    InpObjTrailingStep           = 0 ;                 // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string    t1= "---- Line Name           -----" ;               //
input string    InpObjUpName                 = "Имя Линии Up" ;     // Obj: Up (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InpTradeCommand    = UpName_s;           // Obj:  command: UP
input string    InpObjDownName               = "Имя Линии Down" ;   // Obj: Down (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InTradeCommand     = DownName_b;         // Obj:  command: DOWN
input ushort    InpObjStep                   = 15 ;                 // Obj: Step (distance from price to object, in pips)
파일:
0006.mq5  109 kb
 
Valeriy Yastremskiy :

암시적 유형 캐스팅에 대한 경고입니다. 엄격한(엄격한) 실행의 경우 암시적 캐스트는 경고를 제공합니다.

유형을 명시적으로 캐스팅해야 합니다. 그리고 MT5에는 항상 엄격한 실행이 있습니다. MT4에서는 속성에서 #property strict를 선택하거나 지정하지 않을 수 있습니다.

당신 말이 맞아, 발레리! 이 형식에서는 모든 것이 제대로 작동합니다. EA 초기화 블록의 최종 버전:

 //--- create handle of the indicator iCustom
   handle_iCustom= iCustom (m_symbol.Name(), Period (), "Examples\\ZigzagColor" ,
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd ( ChartID (), 0 ,handle_iCustom);

EA 초기화 해제 블록에서:

 ChartIndicatorDelete ( 0 , 0 , "ZigZag(" +( string )Inp_ZZ_Depth+ "," +( string )Inp_ZZ_Deviation+ "," +( string )Inp_ZZ_Backstep+ ")" );

팁 고마워!

안부 인사를 전합니다. 블라디미르.

 
Роман Жилин :

오오오오오오오오오오오오오오오오오오오오오오오오오오오오오오오오 감사합니다.

출장만 가는데 주어진 자료들 깊숙이 파고드는게 더 어려울 것 같은데 코딩은 어떨지... 시트에 가능하니 좋은 운동이 될거 같아요...


존경합니다, 로만

모두 좋은 하루!

Roman이 출장 중이고 이 스레드에 참여하지 않는 동안 대신 MQL5 프로그래밍 언어에 대해 계속 질문할 것입니다. https://www.mql5.com/en/code/2142 의 CodeBase에서 최대 지분 위험 비율 라이브러리를 찾았습니다. 나는 매수 및 매도 포지션의 개설을 구현하기 위해 하나의 단순한 Expert Advisor의 코드를 시도하기로 결정했지만 고정된 로트가 아니라 자본 위험의 최대 비율로 구현했습니다.

다음은 소스 코드입니다(주요 작업에 집중하기 위해 불필요한 모든 것을 제거했습니다).

 //+------------------------------------------------------------------+
//|                                                  11111111111.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"

input int       TakeProfit= 300 ; //Тейк-профит
input int       StopLoss= 250 ;   //Стоп-лосс
input double    lot= 0.1 ;         //Лот

double Ask;
double Bid;
//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong( double volume= 0.1 ,
             int slippage= 10 ,
             string comment= "Long" ,
             int magic= 0 )
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory (my_trade);
   my_trade.action= TRADE_ACTION_DEAL ;
   my_trade.symbol= Symbol ();
   my_trade.volume= NormalizeDouble (volume, 1 );
   my_trade.price= NormalizeDouble (Ask, _Digits );
   my_trade.sl= NormalizeDouble (Ask-StopLoss* _Point , _Digits );
   my_trade.tp= NormalizeDouble (Ask+TakeProfit* _Point , _Digits );
   my_trade.deviation=slippage;
   my_trade.type= ORDER_TYPE_BUY ;
   my_trade.type_filling= ORDER_FILLING_FOK ;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError ();

   if ( OrderSend (my_trade,my_trade_result))
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
     }
   else
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
       Print ( "Ошибка открытия ордера = " , GetLastError ());
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick ()
  {
.   double Open[];
.
.
         if (Open[ 1 ]>(Open[ 2 ]))
           {
            OpenShort(lot, 10 , "Short" , 1234 );
             return ;
           }
         if ((Open[ 1 ]<Open[ 2 ])
           {
            OpenLong(lot, 10 , "Long" , 1234 );
            cantrade= false ;
             return ;
           }
        }
     }
   return ;
  }
//+------------------------------------------------------------------+

지정된 라이브러리의 코드를 삽입했습니다. 결과는 다음 코드입니다.

 //+------------------------------------------------------------------+
//|                                                  11111111111.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"

#include <Trade\SymbolInfo.mqh> // добавлено из библиотеки

input int       TakeProfit= 300 ; //Тейк-профит
input int       StopLoss= 250 ;   //Стоп-лосс
input double    lot= 0.1 ;         //Лот
input double    MaximumPercentageRisk= 25 ; //Риск - добавлено из библиотеки

bool UseMaximumPercentageRisk= true ; // добавлено из библиотеки
double Ask;
double Bid;
//--- этот блок добавлен из библиотеки
//+------------------------------------------------------------------+
//|  GetLotSize RPTrade                                              |
//+------------------------------------------------------------------+
double GetLotSize( double lotsize)
  {
//--- Gets pair specs  
   CSymbolInfo symInfo;
   int   digits_bn=symInfo. Digits ();
   double   points_bn=symInfo. Point ();
   string symbol_bn= _Symbol ;
//--- adjust lot 
   int tmpdecimal= 1 ;
   double old_lot=lotsize;
//---
   if (( NormalizeDouble ( AccountInfoDouble ( ACCOUNT_FREEMARGIN )*(MaximumPercentageRisk/ 100 )/ 1000.0 ,tmpdecimal)<lotsize) 
   && UseMaximumPercentageRisk) //лот подходит под риск ?
     {
      lotsize= NormalizeDouble ( AccountInfoDouble ( ACCOUNT_FREEMARGIN )
      *(MaximumPercentageRisk/ 100 )/ 1000.0 ,tmpdecimal);   //расчет нового размера лота 

       if (lotsize< SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_MIN )) //размер лота подходит под минимльный размер лота брокера ?
        {
         lotsize= SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_MIN ); //Нет! Настройка размера лота под минимальный размер лота брокера
         Print ( _Symbol , " Lot adjusted from " ,old_lot, " для уменьшения размера разрешенного сервером " ,lotsize);
        }
       else
        {
         Print ( _Symbol , " Lot adjusted from " ,old_lot,
         " to " ,lotsize, " для соответствия условию максимального риска. В каждой сделке рисковать можно только " ,
         MaximumPercentageRisk, "% от свободной маржи." );   //Да! 
         if ( MathAbs (lotsize/ SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP )
         - MathRound (lotsize/ SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP )))> 1.0 E- 10 ) //Размер лота подходит под разрешенный шаг брокера ?
           {
            lotsize= SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP )
            * NormalizeDouble (lotsize/ SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP ), 0 );   //НЕТ! Перерасчет размера лота.    
             Print ( "M-" , _Symbol , " Warning: Your calculated percentage at risk lot size of was not a multiple of minimal step" ,
             SymbolInfoDouble (symbol_bn, SYMBOL_VOLUME_STEP ), ". Размер лота изменился до" ,lotsize);
           }
        }
     }
   return (lotsize);
 }

//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong( double volume= 0.1 ,
             int slippage= 10 ,
             string comment= "Long" ,
             int magic= 0 )
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory (my_trade);
   my_trade.action= TRADE_ACTION_DEAL ;
   my_trade.symbol= Symbol ();
   my_trade.volume= NormalizeDouble (volume, 1 );
   my_trade.price= NormalizeDouble (Ask, _Digits );
   my_trade.sl= NormalizeDouble (Ask-StopLoss* _Point , _Digits );
   my_trade.tp= NormalizeDouble (Ask+TakeProfit* _Point , _Digits );
   my_trade.deviation=slippage;
   my_trade.type= ORDER_TYPE_BUY ;
   my_trade.type_filling= ORDER_FILLING_FOK ;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError ();

   if ( OrderSend (my_trade,my_trade_result))
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
     }
   else
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
       Print ( "Ошибка открытия ордера = " , GetLastError ());
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick ()
  {
.   double Open[];
.
.
         if (Open[ 1 ]>(Open[ 2 ]))
           {
            OpenShort(lot, 10 , "Short" , 1234 );
             return ;
           }
         if ((Open[ 1 ]<Open[ 2 ])
           {
            OpenLong(lot, 10 , "Long" , 1234 );
            cantrade= false ;
             return ;
           }
        }
     }
   return ;
  }
//+------------------------------------------------------------------+

그러나 고문은 둘 다 고정된 부지에서 일했고 계속해서 일했습니다. 위험은 고려되지 않습니다. 자본 위험 비율을 얻기 위해 무엇을 해야 하는지 알려주세요.

안부 인사를 전합니다. 블라디미르.

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
여러분, 전체 주제에서 토론은 한 페이지이고 나머지는 코드입니다. 코드를 삽입하는 것만으로도 충분할까요?
 
MrBrooklin :

모두 좋은 하루!

Roman이 출장 중이어서 이 스레드에 적극적으로 참여하지 않는 동안 대신 MQL5 프로그래밍 언어에 대해 계속 질문할 것입니다. https://www.mql5.com/en/code/2142 의 CodeBase에서 최대 지분 위험 비율 라이브러리를 찾았습니다. 나는 하나의 단순한 Expert Advisor의 코드에서 매수 및 매도 포지션을 열기로 결정했지만 고정된 로트가 아니라 자본 위험의 최대 비율로 열었습니다.

다음은 소스 코드입니다(주요 작업에 집중하기 위해 불필요한 모든 것을 제거했습니다).

지정된 라이브러리의 코드를 삽입했습니다. 결과는 다음 코드입니다.

그러나 고문은 둘 다 고정된 부지에서 일했고 계속해서 일했습니다. 위험은 고려되지 않습니다. 자본 위험 비율을 얻기 위해 무엇을 해야 하는지 알려주세요.

안부 인사를 전합니다. 블라디미르.

글쎄, 쓰여진대로 작동합니다. Lot==0이면 선이 필요하고 위험한 로트를 고려하고 마지막에 계산 값을 Lot 변수에 할당합니다.

네 가지에는 추가 변수 Lts를 통해 그러한 옵션이 있습니다.

 bool CheckMoneyForTrade()
 {
 RefreshRates();                               // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);         // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED); // Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0 )                                 // Если заданы лоты,то 
      Lts =Lots;                                 // с ними и работаем 
   else                                          // % свободных средств
      Lts= MathFloor (Free*Prots/One_Lot/Step)*Step; // Для открытия
 
   if (Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                       // Лот дороже свободн.
     {
       Alert ( " Not enough money for " , Lts, " lots" );
     Work= false ;
       return ( false ) ;                                   // Выход из функции()
     }
     return ( true );
     }
 
VVT :
여러분, 전체 주제에서 토론은 한 페이지이고 나머지는 코드입니다. 코드를 삽입하는 것만으로도 충분할까요?

그러면 어떻게 도와야 할까요?

 
SanAlex :

그러면 어떻게 도와야 할까요?

요청한 내용만 삽입

 
Valeriy Yastremskiy :

글쎄, 쓰여진대로 작동합니다. Lot==0이면 선이 필요하고 위험한 로트를 고려하고 마지막에 계산 값을 Lot 변수에 할당합니다.

네 가지에는 추가 변수 Lts를 통해 그러한 옵션이 있습니다.

Valery 감사합니다. 오늘 밤에 시도해 보겠습니다!

안부 인사를 전합니다. 블라디미르.