[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 546

 

В советнике имею следующий блок (Счетчик событий):

if (isCloseLastPosByStop()==True) //Если последний ордер закрылся Стопом

{
N=N+1;
Alert(N, " лось");
} else N=0;

ВОПРОС: как вместо вывода информации на экран записать данные в файл (эксель)?

 
Dimka-novitsek:

Добрый день! Подскажите, как это может быть, я в одном цикле выбираю ордер, по-времини перебираю, какой ордер последний, и запоминаю его так ticket = OrderTicket();

в данном случае допустим это цифра два. Чуто позже if (ticket>-1){
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY);

и зачастую получаю ошибку 4105 - ордер не выбран!!


А потому, что ордер еще не закрыт. Его нет в MODE_HISTORY, он ещё в MODE_TRADES.
 

for(  i=0;i<=OrdersHistoryTotal();i++){
    OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY);
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

Што вы! Почему же нет? Открытых ордеров на момент перебора не было! Может я не понял?

И цикл перебора ведь тоже на истории! Там где я в нем переменной int ticket присваиваю

А ругается, извините, так 2012.02.04 11:28:47 2011.12.06 16:35 антиб EURUSD,M30: Alert: SELL Select error HISTORYticket 4105

Когда же попадает он из MODE_HISTORY, в MODE_TRADES ??

А главное, я же ведь его же, этот же ордер, так же на истории отбираю с помощью ордердер селект, и по-первах он же отбирается, иначе б я с ним и работать не смог!! Логики нету!!!!!!Яв шоке..




 
Dimka-novitsek:

Што вы! Почему же нет? Открытых ордеров на момент перебора не было! Может я не понял?

И цикл перебора ведь тоже на истории! Там где я в нем переменной int ticket присваиваю

А ругается, извините, так 2012.02.04 11:28:47 2011.12.06 16:35 антиб EURUSD,M30: Alert: SELL Select error HISTORYticket 4105

Когда же попадает он из MODE_HISTORY, в MODE_TRADES ??


ticket=-1;
for(  i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY));{
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;
Добавлена строка в начале и исправлены две следующии строчки кода.
 
Спасибо!!
 

помогите вставить стоп-лосс в советник

пожалуйста

Файлы:
my_1.mq4  10 kb
 
поделитесь пожалуйста функция расчета максимально допустимого лота, с учетом открытых позиций то есть по эквити. а то стандартная считает риск но если есть сделки денег не хватает на открытие
 
T-G:
поделитесь пожалуйста функция расчета максимально допустимого лота, с учетом открытых позиций то есть по эквити. а то стандартная считает риск но если есть сделки денег не хватает на открытие


В простейшем случае так:

double Klots = 0.1; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots=NormalizeDouble(Klots*AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);Lots=MathMax(MarketInfo(Symbol(),MODE_MINLOT),Lots);
 

Ребята подскажите по такому вопросу:

Вот скрипт поиска максимального размера безотката по зиг-загу от хренфх - см. здесь:

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}

Бросаю его на график инструмента на М5 - считает нормально при умолчательном временном диапазоне

extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

это максимальная глубина истории по инструменту в конторе Альпари, при ее закачке через F2 - я проверял, т.е. имеет вид содержимо вкладки "Эксперты" клиентского терминала - вроде похоже на правду:

При использовании этой же конструкции скрипта у себя в советнике на том же временном интервале на том же периоде графика М5 считает не правильно, т.е.

пишет совсем другие (меньшие, чем в скрипте) числа или вообще 0. В чем может быть ошибка или это какая-то несогласованность истории? Благодарю.

Т.е. я стартую в тестере совом позже расчетного времени для нахождения безотката, по идее - все нормально и цифры по итогам работы скрипта и сова - должны быть ОДИНАКОВЫ... В чем может быть ошибка?

 

Вот так я заряжаю этого скрипта к себе в сова:

extern string A3 = "Расчет безотката";
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
  //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
    int ZigZagData[];
    int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
    ArraySort(ZigZagData);
  
    Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");        

  
   
    return (0);
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

Вроде все одно и тоже - в чем может быть ошибка?

Причина обращения: