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

 

Уважаемые, нужна помощь.

Взял код учета, открытия и закрытия ордеров из учебника(tradingexpert.mq4). Код предназначен для работы с одной позицией. Необходимо, чтобы позиций было пять.

Несколько видоизменив код, получилось сделать так (измененные строки выделены жирным), что позиции открываются в нужном количестве, но при смене закрывается только одна и сразу открывается противоположная позиция.

Как сделать так, чтобы при развороте закрывались все позиции, а затем только открывалась противоположная позиция?

   // Учёт ордеров
   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>5)                           // Было не более одного орд, стало не более пяти
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total < 5 && Opn_B==true)     // Открытых орд. нет +. Было Total < 1, стало Total < 5
        {                                       // критерий откр. 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()
        }
   // Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер 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()
        }
 
Forexman77:

Уважаемые, нужна помощь.

Взял код учета, открытия и закрытия ордеров из учебника(tradingexpert.mq4). Код предназначен для работы с одной позицией. Необходимо, чтобы позиций было пять.

Несколько видоизменив код, получилось сделать так (измененные строки выделены жирным), что позиции открываются в нужном количестве, но при смене закрывается только одна и сразу открывается противоположная позиция.

Как сделать так, чтобы при развороте закрывались все позиции, а затем только открывалась противоположная позиция?


Сделайте Ticket массивом Ticket[5], храните в нем все 5 тикетов. При закрытии, соответственно, циклом по всем тикетам.
 
Vinin:

По уровню использования библиотек Вы не можете относиться к новичкам. Смотрел Ваш код, мне нужно недели две разбираться. Если не больше. Так что думаю что ответа Вы не получите
Витя, здесь ничего разбираться не нужно - человек хочет, чтобы глобальные переменные из одной "песочницы" (советник с его библиотеками) были видны в другой "песочнице" (компилируемая библиотека). :)))
 

Уважаемые прошу не критиковать а просто помочь и подсказать . я не крутой прогер а сборщик кодов .Так вот собрал индикатор (вижу что можно делать текстовую выкладку а не файлом т-так и сделаю для облегчения восприятия-

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 2);
SetIndexBuffer(0,Buffer);
return(0);
}
// -------------------------------------------------------------------

int deinit()
{
return(0);
}
//--------------------------------------------------------------------

int start()
{
int StartBar = Bars - IndicatorCounted() - 1;
for(int i = StartBar; i >= 0; i--)
{
if(TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1]))
Buffer[i] = 0;
else
Buffer[i] = Buffer[i+1];
if(Close[i]>Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее и преддыдущее движение растут
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее и преддыдущее движение падают
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]>Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее лвижение растет а предыдущее падает
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее движение падает а предыдущее растет
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
}
return(0);
}
//--------------------------------------------------------------------

Он показывает сумму пунктов и динамику их суммирования в течении недели - на меньших ТФ-мах, если продолжает предыдущее движение от Close[i+2] до Close[i+1] то текущее движение Close[i] плюсуется, если против то минусуется. начало недели дает старт с нуля- в конце недели цикл заканчивается. не перерисовывается . надо как то прописать вместо понятия- закрытие бара-, чтобы программа видела- закрытие пятницы-, понимаю что это можно сделать с помощью DayOfWeek и цифры 5(номер пятницы) но как это сделать практически? помогите.

 
TarasBY:
Витя, здесь ничего разбираться не нужно - человек хочет, чтобы глобальные переменные из одной "песочницы" (советник с его библиотеками) были видны в другой "песочнице" (компилируемая библиотека). :)))

Игорь, чутка не так! В "песочнице" (компилируемой библиотеке) только функции, а все переменные объявлены в инклюднике. А переменные, которые объявлены в инклюднике (включаемом файле) должны быть видны в сове, ведь я вставил инклюдник непосредственно в сову. Вы не согласны?
 
Vitek2010:

Уважаемые прошу не критиковать а просто помочь и подсказать . я не крутой прогер а сборщик кодов .Так вот собрал индикатор (вижу что можно делать текстовую выкладку а не файлом т-так и сделаю для облегчения восприятия-

Он показывает сумму пунктов и динамику их суммирования в течении недели - на меньших ТФ-мах, если продолжает предыдущее движение от Close[i+2] до Close[i+1] то текущее движение Close[i] плюсуется, если против то минусуется. начало недели дает старт с нуля- в конце недели цикл заканчивается. не перерисовывается . надо как то прописать вместо понятия- закрытие бара-, чтобы программа видела- закрытие пятницы-, понимаю что это можно сделать с помощью DayOfWeek и цифры 5(номер пятницы) но как это сделать практически? помогите.


Так устроит?

//+------------------------------------------------------------------+
//|                                                    Vitek2010.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
  {
   SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,2);
   SetIndexBuffer(0,Buffer);
   return(0);
  }
// -------------------------------------------------------------------

int deinit()
  {
   return(0);
  }
//--------------------------------------------------------------------

int start()
  {
   int StartBar=Bars-IndicatorCounted()-1;
   if (StartBar>1) StartBar--;
   
   for(int i=StartBar; i>=0; i--)
     {
      Buffer[i]=Buffer[i+1];
      int pos0=iBarShift(NULL, PERIOD_W1, Time[i]);
      int pos1=iBarShift(NULL, PERIOD_W1, Time[i+1]);
      if (pos0==pos1) 
         Buffer[i]+=MathAbs(Close[i]-Close[i+1]);
      else 
         Buffer[i]=MathAbs(Close[i]-Close[i+1]);
     }
   return(0);
  }
//--------------------------------------------------------------------
 
hoz:

Игорь, чутка не так! В "песочнице" (компилируемой библиотеке) только функции, а все переменные объявлены в инклюднике. А переменные, которые объявлены в инклюднике (включаемом файле) должны быть видны в сове, ведь я вставил инклюдник непосредственно в сову. Вы не согласны?
а при чём тогда упоминание про комплируемую библиотеку?
 
Vinin:


Так устроит?

Нет не устроит. я обьясню - ваш форум это как надежда на последний грамотный оплот прогеров . и вставление размера - именно так и видит это написание PERIOD_W1 но ни использование размера ни использование фиксированных точек отсчета в виде дат не ладут никакого нужного эффекта . поэтому я и написал конкретный вопрос по вставлению конкретного понятия - пятницы - кстати ваш код не компилируеться пишет 'version' - unknown property ("версия " - неизвестное свойство ) так что если не знаете как вставить DayOfWeek и цифры 5(номер пятницы) в тот код который я дал другие варианты не помогут.
 
Vitek2010:
Нет не устроит. я обьясню - ваш форум это как надежда на последний грамотный оплот прогеров . и вставление размера - именно так и видит это написание PERIOD_W1 но ни использование размера ни использование фиксированных точек отсчета в виде дат не ладут никакого нужного эффекта . поэтому я и написал конкретный вопрос по вставлению конкретного понятия - пятницы - кстати ваш код не компилируеться пишет 'version' - unknown property ("версия " - неизвестное свойство ) так что если не знаете как вставить DayOfWeek и цифры 5(номер пятницы) в тот код который я дал другие варианты не помогут.

В TimeDayOfWeek(Time[i]) задают вовсе не Time[i] а конкретную дату в формате D'2014.01.27' .

А если нужно определить какой сегодня день то вызывают просто DayOfWeek().

 
evillive:

В TimeDayOfWeek(Time[i]) задают вовсе не Time[i] а конкретную дату в формате D'2014.01.27' .

А если нужно определить какой сегодня день то вызывают просто DayOfWeek().

И хде вы такое вычитали про TimeDayOfWeek() (в примере)??? :)))
Причина обращения: