Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 486

 
evillive:

Если взять ваше число 108 то максимум в степень 151 получится возвести - 108^151=1,11426138071861е+307

108^152=1,20340229117609е+309 - уже слишком для программирования в МКЛ, не говоря уж о 108^4096

Что за вычисления что такие масштабы понадобились?


я пытаюсь синтезировать аналитику движения цены и нлп-управление вниманием, и мозг на автопилоте :)
 
alex12:
я пытаюсь синтезировать аналитику движения цены и нлп-управление вниманием, и мозг на автопилоте :)
В поисках просветления главное правильно вещества выбирать, дабы не улететь слишком далеко
 

Я начал изучать MQL4 и не могу понять как осуществляется выбор ордера

из учебника:

for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

{

if (OrderSymbol()!= Symb) continue;

Я понимаю так: Для i=1, пока i<= Количества ордеров

Если Выбранный ордер в позиции i-1(т.е ордер №0) существует

Сравнить его по символу

После этого к i прибавить 1(i++) и начать новую итерацию

Не могу понять комментарий // Если есть следующий (что имеется ввиду: следующий по позиции или этот ордер который выбирается в данный момент?)

Объясните пожалуйста русским языком.

 
наверно имелось ввилу если ордер есть, т.е. он существует под номером и-1 то идем к следующему условию.
 
Vladon:
наверно имелось ввилу если ордер есть, т.е. он существует под номером и-1 то идем к следующему условию.

Всегда будет находить ордер под нулевым номером (и-1 который). Дикий какой-то метод определения "следующего" ордера, воистину вводит в заблуждение...
 
Спасибо за объяснения.
 
evillive:

Всегда будет находить ордер под нулевым номером (и-1 который). Дикий какой-то метод определения "следующего" ордера, воистину вводит в заблуждение...


если ордеров нет то при такой конструкции:

for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;

он не перейдет к следующему условию.

потому что ордера и-1 (в нашем случае =0) нет

конечно так писать не привычно, и не понятно почему именно так,

а не например так:

for(int i=0; i<OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;
 

Здраствуйте господа прогеры,у меня вопрос не могу научить часть кода закрывать процент от баланса счета. он закрывает но не процент а все сразу и все ордера какие есть в рынке.мне надо что бы закрывал определенный ордер и вычесленный процент от баланса депозита.подскажите чего не так делаю ?


extern double Percent = 2.0;
extern int Slippage = 2;
double stop;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10;
}

for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol())
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(stop==AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent;
if(stop<=AccountBalance())
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}//if(ostop==AccountBalance()/100*Percent)
}//if (OrderSymbol() == Symbol() )
}//if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//for(int i = OrdersTotal()-1; i>=0; i--)
return;
}//void OnStart()
//+-----------------------------------------------------------------

 
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);

это как?

а это:

if(stop==AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent;

никогда не выполниться

поэтому:

if(stop<=AccountBalance())

всегда будет работать при каждом ордере.

ВЫВОД: все неправильно.

Вашу функцию надо продумывать, быстрого ответа у меня нет.

но для начала хотя бы так:

extern double Percent = 2.0;
extern int Slippage = 2;
double stop;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10;
}

for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol()) 
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(OrderProfit()>=AccountBalance()/100*Percent)

{
if(OrderType() == OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
if(OrderType() == OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}//if(ostop==AccountBalance()/100*Percent)
}//if (OrderSymbol() == Symbol() )
}//if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//for(int i = OrdersTotal()-1; i>=0; i--)
return;
}//void OnStart()
//+-----------------------------------------------------------------
 
Vladon:


если ордеров нет то при такой конструкции:

он не перейдет к следующему условию.

потому что ордера и-1 (в нашем случае =0) нет

конечно так писать не привычно, и не понятно почему именно так,

а не например так:


Да я тоже когда читал подумал, почему сразу не поставить i=0, вроде проще и понятней.

Вот весь код скрипта, посмотрите может есть веские причины почему автор написал i=1, а не i=0, я просто еще мало разбираюсь в этом и могу просто не увидеть, а мне нужно именно понять механизм работы, чтобы потом вопросов не возникало

// closeorder.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   string Symb=Symbol();                        // Финанс. инструмент
   double Dist=1000000.0;                       // Предустановка
   int Real_Order=-1;                           // Пока рыночных нет
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // Не наш фин.инструм.
         int Tip=OrderType();                   // Тип ордера
         if (Tip>1) continue;                   // Отложенный ордер  
         //------------------------------------------------------ 4 --
         double Price=OrderOpenPrice();         // Цена ордера
         if (NormalizeDouble(MathAbs(Price-Win_Price),Digits)< //Выбор
            NormalizeDouble(Dist,Digits))       // самого близкого орд       
           {
            Dist=MathAbs(Price-Win_Price);      // Новое значение
            Real_Order=Tip;                     // Есть рыночный ордер
            int Ticket=OrderTicket();           // Номер ордера
            double Lot=OrderLots();             // Количество лотов
           }
         //------------------------------------------------------ 5 --
        }                                       //Конец анализа ордера
     }                                          //Конец перебора орд.
//--------------------------------------------------------------- 6 --
   while(true)                                  // Цикл закрытия орд.
     {
      if (Real_Order==-1)                       // Если рыночных нет
        {
         Alert("По ",Symb," рыночных ордеров нет");
         break;                                 // Выход из цикла закр        
        }
      //--------------------------------------------------------- 7 --
      switch(Real_Order)                        // По типу ордера
        {
         case 0: double Price_Cls=Bid;          // Ордер Buy
            string Text="Buy ";                 // Текст для Buy
            break;                              // Из switch
         case 1: Price_Cls=Ask;                 // Ордер Sell
            Text="Sell ";                       // Текст для Sell
        }
      Alert("Попытка закрыть ",Text," ",Ticket,". Ожидание ответа..");
      bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрытие ордера
      //--------------------------------------------------------- 8 --
      if (Ans==true)                            // Получилось :)
        {
         Alert ("Закрыт ордер ",Text," ",Ticket);
         break;                                 // Выход из цикла закр
        }
      //--------------------------------------------------------- 9 --
      int Error=GetLastError();                 // Не получилось :(
      switch(Error)                             // Преодолимые ошибки
        {
         case 135:Alert("Цена изменилась. Пробуем ещё раз..");
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
         case 136:Alert("Нет цен. Ждём новый тик..");
            while(RefreshRates()==false)        // До нового тика
               Sleep(1);                        // Задержка в цикле
            continue;                           // На след. итерацию
         case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
            Sleep(500);                         // Простое решение
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
        }
      switch(Error)                             // Критические ошибки
        {
         case 2 : Alert("Общая ошибка.");
            break;                              // Выход из switch
         case 5 : Alert("Старая версия клиентского терминала.");
            break;                              // Выход из switch
         case 64: Alert("Счет заблокирован.");
            break;                              // Выход из switch
         case 133:Alert("Торговля запрещена");
            break;                              // Выход из switch
         default: Alert("Возникла ошибка ",Error);//Другие варианты   
        }
      break;                                    // Выход из цикла закр
     }
//-------------------------------------------------------------- 10 --
   Alert ("Скрипт закончил работу -----------------------------");
   return;                                      // Выход из start()
  }

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