任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 330

 
alexey1979621:

阅读这个东西的教程。

字符串DoubleToStr( double value, int digits)
将一个数字值转换为一个文本字符串,其中包含一个指定精度格式的数字的字符表示。
参数。
价值 - 带浮点的值。
数字 - 一种精度格式,小数点后的数字(0-8)。
例子。


然而,我仍然没有想出在我们的案例中把它附在哪里。再次拯救酋长。

没有什么可以附加的东西。

这是它可以连接的地方。

Print("А ведь цена-то Ask ("+DoubleToStr(Ask,Digits)+") у меня однако с точностью Digits");
它是用于以字符串格式输出,而不是用于计算。
 
artmedia70:

没有什么可以附加的。

你可以在这里做。

它是用于以字符串格式输出,而不是用于计算。
做了一个聪明的举动,从int init()删除了它的地狱。EA文本现在已被规范化。现在一切正常了。artmedia70 谢谢
 
专家顾问将挂单放在离当前价格 一定距离的地方,然后在一定时间后对其进行修改。一切都很顺利,但有时终端不允许修改。那么未修改的订单应该被删除。如何做到这一点?
 
artmedia70:

先生们!!!"。你们这些人对什么感到困惑呢?

iFractals() 返回价格,而不是分形的条数。


是的,有时它不是星期五))))。
 
你好,我在求助,我有一个任务:确定使用商品通道指数技术指标对OJSC Rosneft普通股D 1时间范围的统计数据的有效性,我无法制定如何写这个指标正确地打开和关闭多头和空头头寸,我似乎在做,但顾问拒绝编译,给出错误。请帮忙,这个指标需要在这个清单中应用,我在没有我的 x 更改的情况下呈现它。
 #property copyright "Copyright © 2010, E-Commerce"
#property link        "http://e-commerce.psati.ru"
 
extern double StopLoss= 3000   ;           // SL для открываемого ордера
extern double TakeProfit= 3000 ;           // ТР для открываемого ордера
extern int TrailingStop= 100 ; 
extern double Lots      = 0.1 ;           // Жестко заданное колич. лотов
double Prots     = 0.07 ;         // Процент свободных средств
extern int SignalLine  = 5 ;           // Период расчётной МА
extern int SignalLine1  = 10 ;           // Период расчётной МА
extern int N1 = 5 ;  
extern int N2  = 10 ; 
int Bars_V       = 34 ;           // Колич.баров для расчёта скор
int Aver_Bars    = 0 ;             // Колич. баров для сглаживания
double Level     = 0.001 ;

bool    Work= true ;                       // Эксперт будет работать.
string Symb;                           // Название финанс. инструмента

int start()
  {
   int
   Period_MA=SignalLine1,
   Period_MA_1=SignalLine,
   Total,                               // Количество ордеров в окне 
   Tip=- 1 ,
   coef,                             // Тип выбран. ордера (B=0,S=1)
   Ticket;                             // Номер ордера
   double
   MA_1_t,                             // Значен. МА_1 текущее
   MA_2_t,                             // Значен. МА_2 текущее 
   Lot,                                 // Колич. лотов в выбран.ордере
   Lts,                                 // Колич. лотов в открыв.ордере
   Min_Lot,                             // Минимальное количество лотов
   Step,                               // Шаг изменения размера лота
   Free,                               // Текущие свободные средства
   One_Lot,                             // Стоимость одного лота
   Price,                               // Цена выбранного ордера
   SL,                                 // SL выбранного ордера 
   TP;                               // TP выбранного ордера
   bool
   Ans  = false ,                         // Ответ сервера после закрытия
   Cls_B= false ,                         // Критерий для закрытия  Buy
   Cls_S= false ,                         // Критерий для закрытия  Sell
   Opn_B= false ,                         // Критерий для открытия  Buy
   Opn_S= false ;                         // Критерий для открытия  Sell
   int BBars= 10000000 ;
   if ( Bars < Period_MA_1)                       // Недостаточно баров
     {
       Alert ( "Недостаточно баров в окне. Эксперт не работает." );
       return ;                                   // Выход из start()
     }
   if (Work== false )                               // Критическая ошибка
     {
       Alert ( "Критическая ошибка. Эксперт не работает." );
       return ;                                   // Выход из start()
     }
     
   // Учёт ордеров
   Symb= Symbol ();                               // Название фин.инстр.
   Total= 0 ;                                     // Количество ордеров
   for ( int i= 1 ; i<= OrdersTotal (); i++)           // Цикл перебора ордер
     {
       if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true ) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb) continue ;       // Не наш фин. инструм
         if (OrderType()> 1 )                     // Попался отложенный
           {
             Alert ( "Обнаружен отложенный ордер. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total> 1 )                           // Не более одного орд
           {
             Alert ( "Несколько рыночных ордеров. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Ticket=OrderTicket();                   // Номер выбранн. орд.
         Tip   =OrderType();                     // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                 // SL выбранного орд.
         TP    =OrderTakeProfit();               // TP выбранного орд.
         Lot   =OrderLots();                     // Количество лотов
        }
     }

   // Торговые критерии
   int P= Period_MA_1;             // Период расчётной МА
   int B= Bars_V;                 // Колич.баров для расчёта скорост
   int A= Aver_Bars;               // Колич. баров для сглаживания
   int Z= Period_MA;
   //double L_1=iCustom(NULL,0,"IPM",H,P,B,A,0,0);
   //double L_5=iCustom(NULL,0,"IPM",H,P,B,A,1,0);
   double Ma2_Previus,Ma3_Previus, Ma2_Current, Ma3_CurrentPrice, CurrentLine, PreviousLine, Line15,Current, Line30;
   //Ma3_Previus=iCustom(NULL,0,"444",H,P,B,A,1,1);
   //Ma2_Previus=iCustom(NULL,0,"www",P,Z,N1,N2,0,2);
  
   //Ma3_Current=iCustom(NULL,0,"444",H,P,B,A,1,2);
   // Ma2_Current=iCustom(NULL,0,"www",P,Z,N1,N2,0,1);

//ПАРАМЕТРЫ ОТКРЫТИЯ ДЛИННОЙ ПОЗИЦИИ

if ( iCCI ( Symbol (), 0 , 12 , PRICE_TYPICAL , 0 )>= 100 )
{
if ((NumberOfBarOpenLastPos()> 0 ||NumberOfBarOpenLastPos()==- 1 )&&(NumberOfBarCloseLastPos()> 0 ||NumberOfBarCloseLastPos()==- 1 ))
{ 
Opn_B= true ;
//Cls_S=true;
}
}
 //ПАРАМЕТРЫ ОТКРЫТИЯ короткой ПОЗИЦИИ    
if ( iCCI ( Symbol (), 0 , 20 , PRICE_TYPICAL , 0 )<= 100 )
{
if ((NumberOfBarOpenLastPos()> 0 ||NumberOfBarOpenLastPos()==- 1 )&&(NumberOfBarCloseLastPos()> 0 ||NumberOfBarCloseLastPos()==- 1 ))
{
Opn_S= true ; 
//Cls_B=true;   
}  
}


if (Tip== 0 ){
           if (TrailingStop> 0 )  
              {                 
               if (Bid-OrderOpenPrice()> Point *TrailingStop)
                 {
                   if (SL<Bid- Point *TrailingStop)
                    {
                     OrderModify(Ticket,OrderOpenPrice(),Bid- Point *TrailingStop,TP, 0 ,Green);
                     //return(0);
                    }
                 }
              }
}

if (Tip== 1 ){
           if (TrailingStop> 0 )  
              {                 
               if ((OrderOpenPrice()-Ask)>( Point *TrailingStop))
                 {
                   if (SL>Ask+ Point *TrailingStop)
                    {
                     OrderModify(Ticket,OrderOpenPrice(),Ask+ Point *TrailingStop,TP, 0 ,Red);
                     // return(0);
                    }
                 }
              }
}


   // Закрытие ордеров
   while ( true )                                   // Цикл закрытия орд.
     {
//длинной
if ( iCCI ( Symbol (), 0 , 12 , PRICE_TYPICAL , 0 )<= 100 ){
       if (Tip== 0 )                 // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert ( "Попытка закрыть Buy " ,Ticket, ". Ожидание ответа.." );
         RefreshRates();                         // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid, 2 );       // Закрытие Buy
         if (Ans== true )                         // Получилось :)
           {
             Alert ( "Закрыт ордер Buy " ,Ticket);
             break ;                               // Выход из цикла закр
           }
                           
            
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
        }

// короткой       
//if (Close[i]<0)
if ( iCCI ( Symbol (), 0 , 20 , PRICE_TYPICAL , 0 )>= 100 ){
       if (Tip== 1 )                 // Открыт ордер Sell..
        {                                       // и есть критерий закр
         Alert ( "Попытка закрыть Sell " ,Ticket, ". Ожидание ответа.." );
         RefreshRates();                         // Обновление данных
         Ans=OrderClose(Ticket,Lot,Ask, 2 );       // Закрытие Sell
         if (Ans== true )                         // Получилось :)
           {
             Alert ( "Закрыт ордер Sell " ,Ticket);
             break ;                               // Выход из цикла закр
           }
                  
           
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
        }
       break ;                                     // Выход из while
     }



// Стоимость ордеров
   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 ( " Не хватает денег на " , Lts, " лотов" );
       return ;                                   // Выход из start()
     }
   // Открытие ордеров
   while ( true )                                   // Цикл закрытия орд.
     {
       if (Total== 0 && Opn_B== true )               // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();          
         SL=Bid - New_Stop(StopLoss)* Point ;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_BUY,Lts,Ask, 2 ,SL,TP); //Открытие Buy

         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       if (Total== 0 && Opn_S== true )               // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();        
         SL=Ask + New_Stop(StopLoss)* Point ;     // Вычисление SL откр.
         TP=Ask - New_Stop(TakeProfit)* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Sell. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_SELL,Lts,Bid, 2 ,SL,TP); //Открытие Sel
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Sell " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       break ;                                     // Выход из while
     }
   return ;                                       // Выход из start()
  }
int Fun_Error( int Error)                         // Ф-ия обработ ошибок
  {
   switch (Error)
     {                                           // Преодолимые ошибки            
       case    4 : Alert ( "Торговый сервер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 135 : Alert ( "Цена изменилась. Пробуем ещё раз.." );
         RefreshRates();                         // Обновим данные
         return ( 1 );                             // Выход из функции
       case 136 : Alert ( "Нет цен. Ждём новый тик.." );
         while (RefreshRates()== false )           // До нового тика
             Sleep ( 1 );                           // Задержка в цикле
         return ( 1 );                             // Выход из функции
       case 137 : Alert ( "Брокер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 146 : Alert ( "Подсистема торговли занята. Пробуем ещё.." );
         Sleep ( 500 );                             // Простое решение
         return ( 1 );                             // Выход из функции
         // Критические ошибки
       case    2 : Alert ( "Общая ошибка." );
         return ( 0 );                             // Выход из функции
       case    5 : Alert ( "Старая версия терминала." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 64 : Alert ( "Счет заблокирован." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 133 : Alert ( "Торговля запрещена." );
         return ( 0 );                             // Выход из функции
       case 134 : Alert ( "Недостаточно денег для совершения операции." );
         return ( 0 );                             // Выход из функции
       default : Alert ( "Возникла ошибка " ,Error); // Другие варианты   
         return ( 0 );                             // Выход из функции
     }
  }
int New_Stop( int Parametr)                       // Проверка стоп-прик.
  {
   int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL); // Миним. дистанция
   if (Parametr<Min_Dist)                       // Если меньше допуст.
     {
      Parametr=Min_Dist;                         // Установим допуст.
       Alert ( "Увеличена дистанция стоп-приказа." );
     }
   return (Parametr);                             // Возврат значения
  }
 
 int NumberOfBarOpenLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
   datetime t;
   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) {
   if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
   if (op< 0 || OrderType()==op) {
   if (mn< 0 || OrderMagicNumber()==mn) {
   if (t<OrderOpenTime()) t=OrderOpenTime();
  }
  }
  }
  }
  }
  }
   return (iBarShift(sy, tf, t, True));
}
int NumberOfBarCloseLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
   datetime t;
   int       i, k=OrdersHistoryTotal();

   if (sy== "" || sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
       if (OrderSymbol()==sy) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (op< 0 || OrderType()==op) {
             if (mn< 0 || OrderMagicNumber()==mn) {
               if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
   return (iBarShift(sy, tf, t, True));
}
 
niformalka:
您好,非常请您帮忙,我有一项工作:确定技术指标商品通道指数在统计数据时间框架D1"俄罗斯石油公司 "普通股上的有效性,我无法制定如何正确写出这个指标来打开和关闭一个多头和空头头寸,我想我做到了,但理事会拒绝编译,给出一个错误。我想我在这里需要帮助,我需要将这个指标应用到这个列表中,但我还没有改变它。
所以这是你的顾问,而不是指标......没有错误的编译正在进行中....,现在我将玩玩你的代码..... 假设....。
 
Sepulca:
所以它是一个EA,而不是一个指标....Compiling goes without errors....I'm going to play with your code..... hypotest....


我需要在我的EA中准确地应用我需要的指标,即icc,它编译了源代码
 
alsu:

是的,有时它不是星期五))))。

它有什么问题?

//+------------------------------------------------------------------+
//|                                                  TestFractal.mq4 |
//|                               Copyright 2013, Artyom A. Trishkin |
//|                       https://www.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, Artyom A. Trishkin"
#property link      "https://www.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property  strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int i=3; i<300; i++) {
      double fu=iFractals(Symbol(),Period(),MODE_UPPER,i);
      double fd=iFractals(Symbol(),Period(),MODE_LOWER,i);
      if(fu>0) Print("Значение UP на баре "+(string)i+" = "+DoubleToStr(fu,Digits));
      if(fd>0) Print("Значение DN на баре "+(string)i+" = "+DoubleToStr(fd,Digits));
      }
  }
//+------------------------------------------------------------------+

价格回归...

 

让我们从最主要的事情开始,从零开始超额订购其实并不明智。最好从最后一个开始

for(int i=OrderTotal-1; i>=0; i--)          // Цикл перебора ордер
我们不希望陷入这样一种情况:我们已经关闭/删除了零号订单,而上面还有更多的订单。如果你使用账户上的最后一个订单,就不会发生什么坏事。
 
Sepulca:

Начнем с главного, не совсем грамотно перебирать ордера с нулевого. Лучше с последнего

Чтобы не возникало ситуации, когда нулевой по счету закрыли/удалили а там ещё ордера есть. всё переколбасилось. Когда действуете с последним по счёту ничего страшного не происходит.


老师证明,除了开仓和平仓空头和多头的那几行,代码中没有什么需要修改的地方,我做了这样的事情,但是没有编译出来
if ((iCCI(Symbol,0,14,PRICE_TYPICAL,0)<100)&&(iCCI(Symbol,0,14,PRICE_TYPICAL,0)<-100))