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

 
Vinin:

Вы уверены что у Вас все фигурные скобки стоят. Местами их не хватает. Логика из-за этого хромает. И вернее всего результат получается не тот что Вы ожидали
Вить, ты чё, в отъезде был? Не видать что-то тебя долго было...
 
artmedia70:
Вить, ты чё, в отъезде был? Не видать что-то тебя долго было...


Сегодня дома был (почти)
 
Vinin:

Сегодня дома был (почти)
Я уже вторую неделю почти дома :))
 
Vinin:

Вы уверены что у Вас все фигурные скобки стоят. Местами их не хватает. Логика из-за этого хромает. И вернее всего результат получается не тот что Вы ожидали

Если Вы насчет кода индикатора - то там со скобками все нормально, индикатор работает, дает сигналы в виде стрелок(на покупку/продажу-4 и 5 индикаторные буфферы). А вот при считывании этих стрелок из индикатора в советнике получается ерунда. Советник я привел не полностью, потому что там главное понять как считать считать сигнал и сделать соответствующую операцию. В общем проблема в считывании сигнала.
 
paladin80:

Чтобы тут вставить правильно код нажмине сперва на SRC, а потом скопируйте туда код.

Если я правильно вас понял в определённый момент времени надо открыть один OP_BUYSTOP и один OP_SELLSTOP ? Допустимо ли в этот момент наличие каких-либо других отложенных ордеров? Напр. есть отложенники, но перед тем как открыть новые надо удалить старые?



if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5

if ((volum<=n)==true)// если объем свечей меньше или равно n пунктов 
{ 
OrderSend ( Symbol (), OP_BUYSTOP, параметры);// открываем отложенный ордер байстоп
OrderSend ( Symbol (), OP_SELLSTOP, параметры);// открываем отложенный ордер селлстоп
}

if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)&& OrderTakeProfit()==true) ///если первый открывшийся отложенный ордер закрыт с профитом
{
OrderDelete(1);// удаляем второй открытый отложенный ордер
}

}
bool closeorder;//определим  закрытие ордеров
closeorder=true;

if (closeorder==true)//
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время 
{
for(int i=OrdersTotal()-1; i>=0; i--)// определяем количество открытых позиций, и отложенных ордеров и закрываем все возможные позиции, и отложенные ордера
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
{
for(int D=OrdersTotal()-1; D>=0; D--)
if (OrderSelect(D,SELECT_BY_TICKET,MODE_TRADES)==true)
if (OrderType()==OP_BUYSTOP ) OrderDelete(D); //удаляем отложенный байстоп
if (OrderType()==OP_SELLSTOP) OrderDelete(D);// удаляем отложенный селлстоп

уже кинул общий код, чтобы было понятнее.. В конце дня закрытие всех возможных позиций и ордеров хотелось сделать..

а во время открытия двух отложенников (утром) по плану нет никакких открытых ордеров или открытых до этого позиций, т.к. они по времени должны все быть закрыты вечером в определенное время. Интересно у меня хоть полное закрытие ордеров правильно описано?=)))



 
artmedia70:

Мне, честно говоря, неизвестна логика вашей функции. Должна она удалять объекты или должна их строить, мне неизвестно. Скажите, что хотите от неё и мы тут посмотрим, где заковыка в логике. Впрочем, раз ф-ция пытается построить граф. объект, но выдаёт ошибку, значит он уже есть. Вот что дальше по логике вашей программы? Можно построить новый объект с другим именем (например, к именам объектов добавляйте текущее время (TimeToStr(TimeCurrent()))), либо, если объект уже есть, но нужно изменить его свойства, то не стройте объект по-новой, а просто измените его свойства. Тогда ошибка не появится больше.

Всё просто. Главное - знать, чего хочется... :)



Вообще то, функция всего навсего как визуальная замена принта, только выводит всё на экран. Написано не особо ещё грамотно, но работает.. :) Доберусь, перепишу. А вот тогда можно и подумать над тем вопросом что был.

Кстати, если не строить новые объекты, а а изменять свойства уже существующих, то опять же... Головняк будет. По задумке, нужно выводить последние N-косяков на экран. Если постоянно крайний объект переписывать, то будет только 1 объект, с канкретным косяком(ошибкой). Можно пойти дальше, и через цикл отобрать столько объектов, сколько нужно и только их переписывать, но это не стоит видимо усилий, т.к. функция лишь для теста, и заморачиваться не особо горю желание, в силу того, что и так много чего нужно сделать. Как-нибудь попроавлю код той функции, и доведу её до ума, а тогда и можно подумать!

 

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

Можно всё писать через массивы, конечно, но я пошёл обычным способом. Вот так:

for (int li_ord=OrdersTotal()-1; li_ord>=0; li_ord--)
   {
      if (!OrderSelect(li_ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();

      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

Условие:

 if (GetLastOrderState() != 0)

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


Вот сама функция, чтоб не было сомнений, что с ней что-нибудь не так(Критика и замечания приветствуются, и даже более чем приветствуются:))) ):

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
double GetLastOrderState()
{
   double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
          lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   
   return (lastOrderCloseTime);
}
 
vovak_85:

Если Вы насчет кода индикатора - то там со скобками все нормально, индикатор работает, дает сигналы в виде стрелок(на покупку/продажу-4 и 5 индикаторные буфферы). А вот при считывании этих стрелок из индикатора в советнике получается ерунда. Советник я привел не полностью, потому что там главное понять как считать считать сигнал и сделать соответствующую операцию. В общем проблема в считывании сигнала.
Это ваше :
double L_B=iCustom(0,0,"Makedonskii",MM,MP,0,4);

double L_S=iCustom(0,0,"Makedonskii",MM,MP,0,5);

А надо так:
double L_B=iCustom(NULL,0,"Makedonskii",MM,MP,4,0);

double L_S=iCustom(NULL,0,"Makedonskii",MM,MP,5,0);
Как-то так.
 
hoz:

Вообще то, функция всего навсего как визуальная замена принта, только выводит всё на экран. Написано не особо ещё грамотно, но работает.. :) Доберусь, перепишу. А вот тогда можно и подумать над тем вопросом что был.

Кстати, если не строить новые объекты, а а изменять свойства уже существующих, то опять же... Головняк будет. По задумке, нужно выводить последние N-косяков на экран. Если постоянно крайний объект переписывать, то будет только 1 объект, с канкретным косяком(ошибкой). Можно пойти дальше, и через цикл отобрать столько объектов, сколько нужно и только их переписывать, но это не стоит видимо усилий, т.к. функция лишь для теста, и заморачиваться не особо горю желание, в силу того, что и так много чего нужно сделать. Как-нибудь попроавлю код той функции, и доведу её до ума, а тогда и можно подумать!

Я как-то делал функцию, которая выводит сообщения в окно пустого индюкатора. Можно настраивать цвета выводимых строк. Она уже отлажена. Если вдруг, могу и поделиться.
 
r772ra:
Это ваше : А надо так:
Как-то так.

спасибо за поправку, но алгоритм правильно не заработал...
Причина обращения: