Кто может помочь с безубытком? (MQL4) - страница 2

 

Благодарю хоть глаза немного раскрылись я записал код так

#property copyright ""
#property link      ""
#property version   "1.00"
#property strict
input double Lots=0.1;
input int SL=100;
input int TP=100;
input int Magic=2345;
input int Period_MA_1=1;
input int Period_MA_2=6;
input bool buy = true;      //флаг разрешающий/запрещающий покупки 
input bool sell = true;     // здесь было false не знаю насколько это важно ошибок нет 
input int orders = 3;
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnTick()
  {
   int i=0;
   int ticket=0;
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   if(buy)
     {
      while(i<orders)
        {
         RefreshRates();                   эта функция не имеет особого значения
          if(MA_1 > MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,0,0,"",Magic,0,clrGreen);
         if(ticket!=-1)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
              ticket=OrderModify(ticket,OrderOpenPrice(),Ask-SL*Point,Bid+TP*Point,0,clrGreen); 
              }
           }
         i++;
        }
     }
   i=0;
   if(sell)
     {
      while(i<orders)
        {
         RefreshRates();
         if(MA_1 < MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,0,0,"",Magic,0,clrRed);
         if(ticket!=-1)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
              ticket=OrderModify(ticket,OrderOpenPrice(),Bid+SL*Point,Ask-TP*Point,0,clrRed);
              }
           }
         i++;
        }
     }
  }                       
void OnDeinit(const int reason)
  {
  }

Но есть ещё такой косяк мне нужно чтобы открытие сделок происходило при единоразовом выполнении условия а оно открывает серию сделок постоянно пока MA_1 > MA_2 на каждом тике т. е. получается бесконечный цикл открытия сделок т. к. MA_1 может находится долгое время над MA_2 или наоборот. Если к примеру робот открыл сделки по выполнению условия то больше он не открывает пока они не будут закрыты. Даже не представляю как будет выглядеть эта запись.

 
Seric29:

Благодарю хоть глаза немного раскрылись я записал код так

Но есть ещё такой косяк мне нужно чтобы открытие сделок происходило при единоразовом выполнении условия а оно открывает серию сделок постоянно пока MA_1 > MA_2 на каждом тике т. е. получается бесконечный цикл открытия сделок т. к. MA_1 может находится долгое время над MA_2 или наоборот. Если к примеру робот открыл сделки по выполнению условия то больше он не открывает пока они не будут закрыты. Даже не представляю как будет выглядеть эта запись.

Ставьте счетчик в код, Если счетчик ==0 то ничего не делать, если условие выполняется то счетчик равен количеству ордеров и уменьшайте его на 1 каждый раз при открытии ордеров.

 

а как это записать на алгоритмическом уровне как это выглядит. Как привязать условие к счётчику я понимаю что всё вроде просто если условие выполняется то то-то то-то нужно присвоить переменную которая будет связана с условием пример

int i=0; не несёт никакой смысловой нагрузки далее идёт запись, 
while(i<orders) здесь переменная i приобретает смысловую нагрузку у нас есть формулировка я так понял здесь в посте ранее мне разъяснили значение 
кода который я нашёл от туда я и взял такие мысли и этот код позволяет открывать 3 сделки сразу.
if(ticket!=-1) вы писали про уменьшение
i++ здесь происходит подсчёт циклов действий 
i=0; обнуляется всё и начинается с начала

А теперь что-то подобное нужно прописать с условием но я не понимаю как

вот  моя первая запись здесь тоже такая проблема

#property copyright ""
#property link      ""
#property version   "1.00"
#property strict
input double Lots=0.1;
input int SL=100;
input int Magic=2345;
input int Period_MA_1=1;
input int Period_MA_2=6;
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnTick()
  {
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   double MA_3;
   MA_3=iMA(_Symbol,0,10,0,1,0,0);
   double MA_4;
   MA_4=iMA(_Symbol,0,14,0,1,0,0);
   int ticket=0;
       if(MA_1 > MA_2)
       ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,0,NULL,0,0,clrGreen);
      if(MA_1 < MA_2)
        ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,0,NULL,0,0,clrRed);
  }
void OnDeinit(const int reason)

  {

 }

Далее но мне нужно открывать 3 ордера сразу код представлен выше, теперь открывается 3 сделки но проблема с бесконечным открытием ордеров остаётся не решённой.

Я взял код из МА из МТ4 и смешал со своим

#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Average sample expert advisor"
#define MAGICMA  20131111
input double Lots=0.1;
input int Period_MA_1=1;
input int Period_MA_2=6;
input int orders=3;
input int SL=100;
input int TP=100;

int CalculateCurrentOrders(string symbol)                           это пользовательская функция которая учитывает сделки
  {
   int buys=0,sells=0;                                              здесь указаны эти сделки их формат(я пробовал тройки вместо 0ей но не работает)          
   for(int i=0;i<orders;i++)                                        оператор который позволяет писать 3 выражения я вписал сюда i<orders чтобы значение было 3  
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;    здесь мы выбираем ордер для работы с ним для чего не понятно 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)    здесь выбирается инструмент и есть возвращаемо значение магический номер для чего не понятно
        {
         if(OrderType()==OP_BUY)  buys++;                     возвращает тип операции тоже не понятно для чего указано что это будут int buys=0,sells=0;

         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);                                   здесь ордера меняются  открываются в обратную сторону или что 
   else       return(-sells);                                 если использовать стандартный код то ордера не меняются 
  }

void CheckForOpen()                                           пользоват. функция в которой описаны условия открытия сделок
  {
   double MA_1;                                               это моё 
   MA_1=iMA(_Symbol,0,1,0,1,0,0);                           
   double MA_2;                                             
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;                                   с этой записью открывается 6 ордеров если использовать код из поста ранее
//--- get Moving Average 
//--- sell conditions
   if(MA_1<MA_2)                                             это моё 
     {
      RefreshRates();                                        если эту функцию удалить ошибок нет зачем она, осбого значения не придаёт масло масленное
      ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,0,0,"",MAGICMA,0,clrGreen); это моё
      if(ticket!=-1)
        {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           {
            ticket=OrderModify(ticket,OrderOpenPrice(),Ask-SL*Point,Bid+TP*Point,0,clrGreen); я удалил блок LotsOptimized и записал свои строки
           }
        }
      return;
     }
//--- buy conditions
   if(MA_1>MA_2)
     {
      RefreshRates();
      ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,0,0,"",MAGICMA,0,clrRed);
      if(ticket!=-1)
        {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           {
            ticket=OrderModify(ticket,OrderOpenPrice(),Bid+SL*Point,Ask-TP*Point,0,clrRed);
           }
        }
      return;
     }
  }

void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)                        этот блок мне тоже не понятен
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
  }

В этом случае 3 сделки он не открывает тут есть не нужные условия которые мне не понятны в общем как-то так.


 
Seric29:

а как это записать на алгоритмическом уровне как это выглядит. Как привязать условие к счётчику я понимаю что всё вроде просто если условие выполняется то то-то то-то нужно присвоить переменную которая будет связана с условием пример

А теперь что-то подобное нужно прописать с условием но я не понимаю как

вот  моя первая запись здесь тоже такая проблема

Далее но мне нужно открывать 3 ордера сразу код представлен выше, теперь открывается 3 сделки но проблема с бесконечным открытием ордеров остаётся не решённой.

Я взял код из МА из МТ4 и смешал со своим

В этом случае 3 сделки он не открывает тут есть не нужные условия которые мне не понятны в общем как-то так.


Я могу ошибаться, но думаю что вам просто нужно до конца разобраться в синтаксисе. Пройдите до конца учебник по mql4. Уверен, после этого большинство вопросов у вас отпадут.

 
Seric29:

а как это записать на алгоритмическом уровне как это выглядит. Как привязать условие к счётчику я понимаю что всё вроде просто если условие выполняется то то-то то-то нужно присвоить переменную которая будет связана с условием пример

А теперь что-то подобное нужно прописать с условием но я не понимаю как

вот  моя первая запись здесь тоже такая проблема

Далее но мне нужно открывать 3 ордера сразу код представлен выше, теперь открывается 3 сделки но проблема с бесконечным открытием ордеров остаётся не решённой.

Я взял код из МА из МТ4 и смешал со своим

В этом случае 3 сделки он не открывает тут есть не нужные условия которые мне не понятны в общем как-то так.


Покажите на графике, где вы хотите открываться. То есть, заскриньте график и отметьте на нем пару примеров, где на нем ваш эксперт должен входить.

 
Vladislav Boyko:

Я могу ошибаться, но думаю что вам просто нужно до конца разобраться в синтаксисе. Пройдите до конца учебник по mql4. Уверен, после этого большинство вопросов у вас отпадут.

Я читал учебник и документацию 2 раза разве что выучить наизусть.

if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL....
 
Seric29:

Я читал учебник и документацию 2 раза разве что выучить наизусть.

#property strict

enum ENUM_SIGNAL_DIRECTION
  {
   NO_SIGNAL,
   BUY_SIGNAL,
   SELL_SIGNAL
  };

input double inpLots        = 0.1;
input int    inp_sl         = 100,
             inp_tp         = 100,
             inp_fma_period = 1,
             inp_sma_period = 6,
             inpSlippage    = 30,
             inpMagic       = 1;

// Для определения нового бара
datetime lastOpenTime;
bool     flagNewBar;

int OnInit()
  {
   lastOpenTime = Time[0]; // После инита бар 0 не считаем новым. Для тестера можно убрать
   
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   
  }

void OnTick()
  {
   flagNewBar = isNewBar(); // Запомним в переменную, на случай если будет необходимость проверять новый бар более одного раза
   opening();
  }

void opening()
  {
   // Проверяем сигнал
   ENUM_SIGNAL_DIRECTION signal = getOpSignal();
   
   if(signal == NO_SIGNAL)
      return;
   
   // Тип открываемых ордеров
   int type = signal == BUY_SIGNAL ? OP_BUY : OP_SELL;
   
   // Открываем 3 ордера
   openMarketOrder(type, inpLots);
   openMarketOrder(type, inpLots);
   openMarketOrder(type, inpLots);
  }

ENUM_SIGNAL_DIRECTION getOpSignal()
  {
   // Проверяем сигнал только с новым баром
   if(!flagNewBar)
      return(NO_SIGNAL);
   
   // Значения на баре 1
   double fma1 = NormalizeDouble(iMA(_Symbol,0,inp_fma_period,0,1,0,1), _Digits),
          sma1 = NormalizeDouble(iMA(_Symbol,0,inp_sma_period,0,1,0,1), _Digits),
   
   // Значения на баре 2
          fma2 = NormalizeDouble(iMA(_Symbol,0,inp_fma_period,0,1,0,2), _Digits),
          sma2 = NormalizeDouble(iMA(_Symbol,0,inp_sma_period,0,1,0,2), _Digits);
   
   if(fma1 > sma1)
     {
      if(fma2 <= sma2)
         return(BUY_SIGNAL);
     }
   
   else if(fma1 < sma1)
      if(fma2 >= sma2)
         return(SELL_SIGNAL);
   
   return(NO_SIGNAL);
  }

bool isNewBar()
  {
   datetime time_0 = Time[0];
   
   if(time_0 <= lastOpenTime)
      return(false);
   
   lastOpenTime = time_0;
   
   return(true);
  }

// Замените на свою функцию открытия ордера
bool openMarketOrder(int cmd, double lot)
  {
   double price,
          sl,
          tp;
   
   if(cmd == OP_BUY)
     {
      price = NormalizeDouble(Ask, _Digits);
      sl    = NormalizeDouble(Ask - inp_sl * _Point, _Digits);
      tp    = NormalizeDouble(Ask + inp_tp * _Point, _Digits);
     }
   
   else
     {
      price = NormalizeDouble(Bid, _Digits);
      sl    = NormalizeDouble(Bid + inp_sl * _Point, _Digits);
      tp    = NormalizeDouble(Bid - inp_tp * _Point, _Digits);
     }
   
   if(OrderSend(_Symbol, cmd, lot, price, inpSlippage, sl, tp, NULL, inpMagic) != -1)
      return(true);
   
   Print("Не удалось открыть ордер. Ошибка ", GetLastError());
   
   return(false);
  }

Вот пример. Открывает 3 ордера после каждого пересечения MA.

 
Vladislav Boyko:

Вот пример. Открывает 3 ордера после каждого пересечения MA.

Я нашёл этот код в учебнике https://book.mql4.com/ru/samples/expert хотел бы спросить почему не работает это не первый случай когда автор разработчик не может даже рабочий пример предоставить чтобы можно было научиться работать с кодом.

#property copyright "Copyright © Book, 2007"
#property link      "http://AutoGraf.dp.ua"
//--------------------------------------------------------------- 1 --
// Численные значения для М15
extern double StopLoss   =200;     // SL для открываемого ордера
extern double TakeProfit =39;      // ТР для открываемого ордера
extern int    Period_MA_1=11;      // Период МА 1
extern int    Period_MA_2=31;      // Период МА 2
extern double Rastvor    =28.0;    // Расстояние между МА 
extern double Lots       =0.1;     // Жестко заданное колич. лотов
extern double Rastvor    =28.0;    // Расстояние между МА 
extern double Lots       =0.1;     // Жестко заданное колич. лотов
extern double Prots      =0.07;    // Процент свободных средств                                 //extern double Prots      =0.07;    // Процент свободных средств

bool Work=true;                    // Эксперт будет работать.
string Symb;                       // Название финанс. инструмента
//--------------------------------------------------------------- 2 --
int start(void)
  {
  int
   Total,                           // Количество ордеров в окне 
   Tip=-1,                          // Тип выбран. ордера (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
//----------------

//--------------------------------------------------------------- 4 --
// Учёт ордеров

   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)                     // Попался отложенный
            // Выход из start()
            Total++;                               // Счётчик рыночн. орд
         if(Total>1) // Не более одного орд
            Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
//--------------------------------------------------------------- 5 --
// Торговые критерии
   MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_1
   MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_2

   if(MA_1_t>MA_2_t+Rastvor*Point) // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if(MA_1_t<MA_2_t-Rastvor*Point) // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --
//    Закрытие ордеров

  while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..
        {                                       //и есть критерий закр
         
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy
         if (Ans==true)                         // Получилось :)
           
            
            break;                              // Выход из цикла закр
           }
                                   
                                         // Выход из start()
        
 
      if (Tip==1 && Cls_S==true)                // Открыт ордер Sell..
        {                                       // и есть критерий закр
         
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Ask,2);      // Закрытие Sell
         if (Ans==true)                         // Получилось :)
           
         break;                           
                                         // Выход из start()
        }
         return(Ticket);                                // Выход из while
     }

//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   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)                      // Лот дороже свободн.
     {
      
      return;                                   // Выход из start()
     }

//--------------------------------------------------------------- 8 --
// Открытие ордеров
   while(true) // Цикл закрытия орд.
     {
      if(Total==0 && Opn_B==true) // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
          

            // Обработка ошибок
            // Повторная попытка
            break;                                // Выход из start()
        }
      if(Total==0 && Opn_S==true) // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         SL=Ask + New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Ask - New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel
         
           break;                            // Выход из start()
           }
                                  // Повторная попытка
                                        // Выход из start()
        
                                         // Выход из while
     }
//--------------------------------------------------------------- 9 --
   return(Ticket);                                     // Выход из start()
  }
//-------------------------------------------------------------- 10 --
/*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);                             // Выход из функции
     }
  }
  */
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr) // Проверка стоп-прик.
  {
   int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      
     }
   return(Parametr);                            // Возврат значения
  }

 
Seric29:

Я нашёл этот код в учебнике https://book.mql4.com/ru/samples/expert хотел бы спросить почему не работает это не первый случай когда автор разработчик не может даже рабочий пример предоставить чтобы можно было научиться работать с кодом.

Как вы думаете? Что это могло бы значить?

В случае, если туго с английским, можно попробовать сделать так:

Примеры в учебнике все работают. Вообще учебник замечательный.

 
Vladislav Boyko:

Как вы думаете? Что это могло бы значить?

В случае, если туго с английским, можно попробовать сделать так:

Примеры в учебнике все работают. Вообще учебник замечательный.

Материал подан исчерпывающе многие начинающие столкнулись с проблемой что сами ни чего не смогли, а в особенности очень исчерпывающе объясняется код что означает написанное понять вообще невозможно. Так сделать как вы показали я смог но мне по коду понятно я могу его понять на 70% что-то просто догадываюсь но не могу составить алгоритм сам не получается. Переводить там ничего не надо есть очень краткое исчерпывающее описание. Я вставляю это дело в компилятор выдаёт ошибку

мало того что я и так не могу понять разобраться так ещё и код битый. Как исправить этот косяк с какой-то определённой переменной. А вы говорите примеры работают и сами же вставили эту ошибку.