우리는 무료 고문을 작성합니다 - 페이지 11

 
4p0ssum :
제 요청에 관심을 가져주셔서 감사합니다. 모든 것을 존중하지만 저는 프로그래머가 아니기 때문에 MQL4 전문가에게 의지하기로 결정했습니다. 내가 게시 한 코드는 다른 조언자로부터 수집했으며 더 정확하게는 Trailing Stop 기능 만 가져 왔습니다. 나머지는 내가 스스로 생각해 낸 것입니다(대기 중인 주문에 관하여). 나는 당신과 다른 전문가들이 내가 게시한 코드를 살펴보고 이 로봇에 두 가지 기능을 더 추가해도 괜찮다면 부탁합니다.
1) 둘 중 하나가 트리거되면 보류 중인 주문이 삭제됩니다.
2) 자동 로트 증가($50마다 0.01, 즉 $100은 0.02)
미리 감사드립니다.

 //+------------------------------------------------------------------+
//|                                                      4p0ssum.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                               http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link        " http://www.mql5.com "
#property version    "1.00"
#property strict

extern int     TakeProfit     = 100.0 ;
extern bool    AllPositions   = True; // Управлять всеми позициями
extern bool    ProfitTrailing = True;   // Тралить только профит
extern int     TrailingStop   = 50 ;     // Фиксированный размер трала
extern int     TrailingStep   = 0 ;     // Шаг трала
extern bool    Del            = false ; // Удалять оппозитный ордер
extern bool    UseSound       = False;   // Использовать звуковой сигнал
extern string NameFileSound  = "expert.wav" ;   // Наименование звукового файла


//------- Внешние параметры модуля -----------------------------------
extern string _Parameters_b_Lots = "---------- Параметры модуля расчёта лота" ;
extern int LotsWayChoice  = 0 ;     // Способ выбора рабочего лота:
                                   //  0-фиксированный,
                                   //  1-процент от депозита,
                                   //  2-фиксированно-пропорциональный,
                                   //  3-фракционно-фиксированный,
extern double Lots        = 0.1 ;   // Фиксированный размер лота
extern int LotsPercent    = 10 ;   // Процент от депозита
extern int LotsDeltaDepo  = 500 ;   // Коэффициент приращения депозита
extern int LotsDepoForOne = 500 ;   // Размер депозита для одного минилота
extern int LotsMax        = 1000 ; // Максимальное количество минилотов


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start() 
{
double TakeProfitLevelB;
double TakeProfitLevelS;

double BuyStart = Ask + 400 * _Point ;
double SellStart = Bid - 400 * _Point ;

TakeProfitLevelB = BuyStart + TakeProfit* Point ;
TakeProfitLevelS = SellStart - TakeProfit* Point ;

if (Open[ 1 ]==Close[ 1 ]&& OrdersTotal ()== 0 )
{
int BuyTicket = OrderSend ( Symbol (),OP_BUYSTOP,GetSizeLot(),BuyStart, 3 , 0 ,TakeProfitLevelB, NULL , 0 , 0 ,Green);
int SellTicket = OrderSend ( Symbol (),OP_SELLSTOP,GetSizeLot(),SellStart, 3 , 0 ,TakeProfitLevelS, NULL , 0 , 0 ,Blue);
}
   for ( int i= 0 ; i< OrdersTotal (); i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (AllPositions || OrderSymbol()== Symbol ()) {
        TrailingPositions();
      }
    }
  }
 if (Del && ExistPositions( Symbol ()))DeleteOrders( Symbol (),- 1 );
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TrailingPositions() 
{
   double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
   if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
     if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
       if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep- 1 )*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
         return ;
      }
    }
  }
   if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
     if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
       if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep- 1 )*pp || OrderStopLoss()== 0 ) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
         return ;
      }
    }
  }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss( double ldStopLoss) 
{
   bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(), 0 ,CLR_NONE);
   if (fm && UseSound) PlaySound (NameFileSound);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions( string sy= "" , int op=- 1 , int mn=- 1 , datetime ot= 0 ) {
   int i, k= OrdersTotal ();

   if (sy== "" || sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderSymbol()==sy || sy== "" ) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (op< 0 || OrderType()==op) {
             if (mn< 0 || OrderMagicNumber()==mn) {
               if (ot<=OrderOpenTime()) return (True);
            }
          }
        }
      }
    }
  }
   return (False);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Удаление ордеров. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - операция                   (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
void DeleteOrders( string sy= "" , int op=- 1 , int mn=- 1 ) {
   int i, k= OrdersTotal (), ot;

   if (sy== "" || sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
       if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
         if (OrderSymbol()==sy && (op< 0 || ot==op)) {
           if (mn< 0 || OrderMagicNumber()==mn) {
            OrderDelete(OrderTicket(), clrRed );
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
string IIFs( bool condition, string ifTrue, string ifFalse) {
   if (condition) return (ifTrue); else return (ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Вывод сообщения в коммент и в журнал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - текст сообщения                                                     |
//+----------------------------------------------------------------------------+
void Message( string m) {
   Comment (m);
   if ( StringLen (m)> 0 ) Print (m);
}
//+------------------------------------------------------------------+
//| Главная функция получения размера лота (вызывается из советника) |
//+------------------------------------------------------------------+
double GetSizeLot()
{
   double dLot;

   if (LotsWayChoice== 0 ) dLot=Lots;

   // фиксированный процент от депозита
   if (LotsWayChoice== 1 )
  {
    dLot= MathCeil (AccountFreeMargin()/ 100000 *LotsPercent)/ 10 ;
  }

   // фиксированно-пропорциональный
   if (LotsWayChoice== 2 )
  {
     int k=LotsDepoForOne;
     for ( double i= 2 ; i<=LotsMax; i++)
    {
      k=k+i*LotsDeltaDepo;
       if (k>AccountFreeMargin())
      {
        dLot=(i- 1 )/ 10000 ; break ;
      }
    }
  }

   // фракционно-фиксированный
   if (LotsWayChoice== 3 )
  {
    dLot= MathCeil ((AccountFreeMargin()-LotsDepoForOne)/LotsDeltaDepo)/ 10 ;
  }
   if (dLot<MarketInfo( Symbol (), MODE_MINLOT)) dLot=MarketInfo( Symbol (), MODE_MINLOT);
   if (dLot< 0.01 ) dLot= 0.01 ;
   return (dLot);
}
//+------------------------------------------------------------------+
 
안녕하세요. Expert Advisor 작성에 도움이 될 수 있는지 알고 싶습니다. 요점은 이것입니다. 양초가 대량(매수 또는 매도)으로 닫힌 후 두 번째 매수 또는 매도 주문이 맞춤형 로트와 TP로 열립니다. 고맙습니다. 당신이 도울 수 있다면)) MT4 터미널
 
ilfatiskhakov :
안녕하세요. Expert Advisor 작성에 도움이 될 수 있는지 알고 싶습니다. 요점은 이것입니다. 양초가 대량(매수 또는 매도)으로 닫힌 후 두 번째 매수 또는 매도 주문이 맞춤형 로트와 TP로 열립니다. 고맙습니다. 당신이 도울 수 있다면)) MT4 터미널

https://www.mql5.com/ru/code/mt4/experts

MQL5 Code Base: Советники
MQL5 Code Base: Советники
  • www.mql5.com
Советники для MetaTrader 4 с исходными кодами
 

안녕하세요! 첨부된 ADC 인디케이터에 어드바이저 작성 부탁드립니다. 이 지표에만 따르고 다른 지표에는 따르지 않습니다. 다양한 종류가 있기 때문입니다.

화살표에서 화살표로의 작동 원리 - 화살표가 나타나면 거래가 열리고 반대 신호가 나타나면 거래가 닫히고 반대 방향으로 열립니다. 로트는 공식 (잔액 x (위험 / 1000)에 따라 계산되며, 여기서 위험은 0에서 1까지입니다. 또한 일정한 로트 함수가 있어야 합니다.

파일:
 
SAJSRAh :

안녕하세요! 첨부된 ADC 인디케이터에 어드바이저 작성 부탁드립니다. 이 지표에만 따르고 다른 지표에는 따르지 않습니다. 다양한 종류가 있기 때문입니다.

화살표에서 화살표로의 작동 원리 - 화살표가 나타나면 거래가 열리고 반대 신호가 나타나면 거래가 닫히고 반대 방향으로 열립니다. 로트는 공식 (잔액 x (위험 / 1000)에 따라 계산되며, 여기서 위험은 0에서 1까지입니다. 또한 일정한 로트 함수가 있어야 합니다.

지속적인 거짓 신호

+ 미래의 지표

 
Iurii Tokman :

지속적인 거짓 신호

+ 미래의 지표

H4에서 수동으로 거래했는데 나쁘지 않은 것으로 나타났습니다.

[삭제]  

유리 토크만 :

지속적인 거짓 신호

+ 미래의 지표

MT5는 진입점이 약간 다릅니다.

EURUSDH1

 //+------------------------------------------------------------------+
//|                                           Back and forth ADX.mq5 |
//|                               Copyright © 2005, BrainTrading Inc |
//|                                       http://www.braintrading.com |
//+------------------------------------------------------------------+
//---- авторство индикатора
#property copyright "Copyright © 2005, BrainTrading Inc."
//---- ссылка на сайт автора
#property link        " http://www.braintrading.com/ "
//---- номер версии индикатора
#property version    "1.00"
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- для расчета и отрисовки индикатора использовано два буфера
#property indicator_buffers 2
//---- использовано всего два графических построения
#property indicator_plots    2
//+----------------------------------------------+
//|  Параметры отрисовки медвежьего индикатора   |
//+----------------------------------------------+
//---- отрисовка индикатора 1 в виде символа
#property indicator_type1    DRAW_ARROW
//---- в качестве цвета медвежьей линии индикатора использован розовый цвет
#property indicator_color1   Wheat
//---- толщина линии индикатора 1 равна 4
#property indicator_width1    2
//---- отображение метки медвежьей линии индикатора
#property indicator_label1    "Back and forth ADX Sell"
//+----------------------------------------------+
//|  Параметры отрисовки бычьго индикатора       |
//+----------------------------------------------+
//---- отрисовка индикатора 2 в виде символа
#property indicator_type2    DRAW_ARROW
//---- в качестве цвета бычей линии индикатора использован зеленый цвет
#property indicator_color2   LightSeaGreen
//---- толщина линии индикатора 2 равна 4
#property indicator_width2    2
//---- отображение метки бычьей линии индикатора
#property indicator_label2 "Back and forth ADX Buy"
//+----------------------------------------------+
//| Входные параметры индикатора                 |
//+----------------------------------------------+
input int adx_period= 14 ;   // период расчета ADX
//---- объявление динамических массивов, которые будут в
//---- дальнейшем использованы в качестве индикаторных буферов
double SellBuffer[];
double BuyBuffer[];
//--- индикаторные буферы
double ADXBuffer[];
double DI_plusBuffer[];
double DI_minusBuffer[];
//---
int OldTrend;
int ADX_Handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//---- получение хендла индикатора ADX
   ADX_Handle= iADX ( Symbol (), Period (),adx_period);
   if (ADX_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iADX" );
//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer ( 0 ,SellBuffer, INDICATOR_DATA );
//---- осуществление сдвига начала отсчета отрисовки индикатора 1
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN , 0 );
//--- создание метки для отображения в DataWindow
   PlotIndexSetString ( 0 , PLOT_LABEL , "Back and forth ADX Sell" );
//---- символ для индикатора
   PlotIndexSetInteger ( 0 , PLOT_ARROW , 108 );
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries (SellBuffer, true );
//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer ( 1 ,BuyBuffer, INDICATOR_DATA );
//---- осуществление сдвига начала отсчета отрисовки индикатора 2
   PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN , 0 );
//--- создание метки для отображения в DataWindow
   PlotIndexSetString ( 1 , PLOT_LABEL , "Back and forth ADX Buy" );
//---- символ для индикатора
   PlotIndexSetInteger ( 1 , PLOT_ARROW , 108 );
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries (BuyBuffer, true );
//--- привязка массивов к индикаторным буферам
   SetIndexBuffer ( 2 ,ADXBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 3 ,DI_plusBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 4 ,DI_minusBuffer, INDICATOR_DATA );
//---- установка формата точности отображения индикатора
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
//---- имя для окон данных и лэйба для субъокон
   string short_name= "Back and forth ADX" ;
   IndicatorSetString ( INDICATOR_SHORTNAME ,short_name);
//----
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---- проверка количества баров на достаточность для расчета
   if ( BarsCalculated (ADX_Handle)<rates_total
      || rates_total< 0 )
       return ( 0 );
//---- объявления локальных переменных
   int to_copy,limit,bar;
   bool ADXUp,ADXDn;
//---- расчеты необходимого количества копируемых данных и
//стартового номера limit для цикла пересчета баров
   if (prev_calculated>rates_total || prev_calculated<= 0 ) // проверка на первый старт расчета индикатора
     {
      to_copy=rates_total; // расчетное количество всех баров
      limit=rates_total- 1 ; // стартовый номер для расчета всех баров
     }
   else
     {
      to_copy=rates_total-prev_calculated+ 1 ; // расчетное количество только новых баров
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
     }
//---- копируем вновь появившиеся данные в массивы
   if ( CopyBuffer (ADX_Handle, 0 , 0 ,to_copy,ADXBuffer)<= 0 )
       return ( 0 );
   if ( CopyBuffer (ADX_Handle, 1 , 0 ,to_copy,DI_plusBuffer)<= 0 )
       return ( 0 );
   if ( CopyBuffer (ADX_Handle, 2 , 0 ,to_copy,DI_minusBuffer)<= 0 )
       return ( 0 );
//---- индексация элементов в массивах как в таймсериях
   ArraySetAsSeries (ADXBuffer, true );
   ArraySetAsSeries (DI_plusBuffer, true );
   ArraySetAsSeries (DI_minusBuffer, true );
   ArraySetAsSeries (open, true );
   ArraySetAsSeries (high, true );
   ArraySetAsSeries (low, true );
   ArraySetAsSeries (close, true );
//---- основной цикл расчета индикатора
   for (bar=limit; bar>= 0 ; bar--)
     {
      SellBuffer[bar]= 0.0 ;
      BuyBuffer[bar]= 0.0 ;
      ADXDn=DI_plusBuffer[bar]<DI_minusBuffer[bar] && ADXBuffer[bar]<DI_minusBuffer[bar];
      ADXUp=DI_plusBuffer[bar]>DI_minusBuffer[bar] && ADXBuffer[bar]>DI_minusBuffer[bar];
       //----
       if (ADXDn)
        {
         if (OldTrend> 0 )
            SellBuffer[bar]=high[bar];
         if (bar!= 0 )
            OldTrend=- 1 ;
        }
       if (ADXUp)
        {
         if (OldTrend< 0 )
            BuyBuffer[bar]=low[bar];
         if (bar!= 0 )
            OldTrend=+ 1 ;
        }
     }
//----
   return (rates_total);
  }
//+------------------------------------------------------------------+

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\

지표 확인을 위해 발사 - 시작은 나쁘지 않은 것 같습니다

여기까지는 나쁘지 않다

지금까지는 나쁘지 않다 2
 
SAJSRAh :

H4에서 수동으로 거래했는데 나쁘지 않은 것으로 나타났습니다.

스튜디오에서 거래의 결과

 
SanAlex :

MT5는 진입점이 약간 다릅니다.

미래는 어디에?

     for ( int i = 0 ; i < limit; i++)
      {
        b4plusdi = iADX ( NULL , 0 , ADXcrossesPeriod, PRICE_CLOSE , MODE_PLUSDI, i - 1 );
 i - 1
[삭제]  
Iurii Tokman :

미래는 어디에?

나는 잘 모르겠다 - 그대로 눈이 멀었다! 과학적인 파밍 방법으로 독학을 하고 있어요

\\\\\\\\\\\\ 스스로도 놀랐습니다. 결과도 나쁘지 않은 것 같습니다. 제 전문가는 어렵습니다. 테스트하는 데 시간이 오래 걸립니다.

지금까지는 나쁘지 않다 3