[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 616

 
Естественно, Вы правы. Подразумевалось, что у Вас уже есть код на снятие показаний только раз в бар.
 
sllawa3:
по моему прав.. у мня тож таки сомнения...

Примерно таким образом можно отслеживать эквити, дабы при достижении заданного процента прибыли по эквити, закрыть все позиции и удалить ордера:

//--------------------------------------------------------------
// Описание глобальных переменных советника
// ----------------- Трал эквити -------------
extern double  PercentEquityForClose=15;
double         Equ_OLD,
               Equ_NEW,
               EquPerc,
               Equ_Start;

// ---- Дальнейшее описание глобальных переменных советника

//==========================================================

int init()                             // Функция init
{
   Equ_OLD=AccountEquity();
   Equ_Start=Equ_OLD; 
   EquPerc=Equ_Start/100*PercentEquityForClose;
   
// ---- Дальнейший код функции ----

   return;                             // Выход из init() 
}

//==========================================================
// ---- В функции слежения за событиями ----
// ---- вызываемой из функции start ----

   Equ_NEW=AccountEquity();                              // С новым тиком запоминаем текущее значение эквити
   if (Equ_OLD!=Equ_NEW)                                 // Если новое значение не равно старому, то
         {
            if (Equ_NEW>=Equ_OLD+EquPerc)                // Если эквити увеличилось по отношению к своему прошлому значению на EquPerc процентов,
               {                                         
                  ClosePosFirstProfit(NULL, -1, -1);     // то закрываем все позиции
                  DeleteOrders(NULL, -1, -1);            // и удаляем все ордера
                  Equ_NEW=AccountEquity();               // Запоминаем текущее значение эквити
                  Equ_OLD=Equ_NEW;                       // и заносим его в "прошлое" значение для проверки на изменение на след. тике
               }
         }

Опять на коленке написал, так что могут быть и ошибки...
Для отслеживания изменения эквити на каждом баре достаточно написать проверку на открытие нового бара и если да, то тогда и выполнять этот кусок кода:

   Equ_NEW=AccountEquity();                              // С новым тиком запоминаем текущее значение эквити
   if (Equ_OLD!=Equ_NEW)                                 // Если новое значение не равно старому, то
         {
            if (Equ_NEW>=Equ_OLD+EquPerc)                // Если эквити увеличилось по отношению к своему прошлому значению на EquPerc процентов,
               {                                         
                  ClosePosFirstProfit(NULL, -1, -1);     // то закрываем все позиции
                  DeleteOrders(NULL, -1, -1);            // и удаляем все ордера
                  Equ_NEW=AccountEquity();               // Запоминаем текущее значение эквити
                  Equ_OLD=Equ_NEW;                       // и заносим его в "прошлое" значение для проверки на изменение на след. тике
               }
         }

По-моему где-то как-то так...

 
Roger:
Естественно, Вы правы. Подразумевалось, что у Вас уже есть код на снятие показаний только раз в бар.
Нет, нету, но выше написал что-то для проверки эквити на каждом тике. Достаточно сделать проверку на открытие нового бара и если да, то тогда и проверять эквити... Думаю, не сложно это...
 
интересует перелом эквити с возрастания на убывание при условии что эквити выше баланса.. для закрытия всего что открыто..
 
sllawa3:
интересует перелом эквити с возрастания на убывание при условии что эквити выше баланса.. для закрытия всего что открыто..

Вот функция определения нового бара:

//+------------------------------------------------------------------+
//|  возвращает признак появления нового бара для указанного периода |
//+------------------------------------------------------------------+
bool isNewBar(int timeFrame)
   {
   bool res=false;
   
   // массив содержит время открытия текущего (нулевого) бара
   // по 7 (семь) таймфреймам
   static datetime _sTime[7];  
   int i=6;
 
   switch (timeFrame) 
      {
      case 1  : i=0; break;
      case 5  : i=2; break;
      case 15 : i=3; break;
      case 30 : i=4; break;
      case 60 : i=5; break;
      case 240: break;
      case 1440:break;
      default:  timeFrame = 1440;
      }
//----
   if (_sTime[i]==0 || _sTime[i]!=iTime(Symbol(),timeFrame,0))
      {
      _sTime[i] = iTime(Symbol(),timeFrame,0);
      res=true;
      }
      
//----
   return(res);   
   }
   

... интересует перелом эквити с возрастания на убывание при условии что эквити выше баланса.. для закрытия всего что открыто..

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

Значит сравниваем не увеличение эквити на столько-то процентов, а тупо его увеличение, либо уменьшение по отношению к состоянию на прошлом тике, записанному в переменной Equ-OLD с его текущим значением в Equ_NEW

 
sllawa3:
интересует перелом эквити с возрастания на убывание при условии что эквити выше баланса.. для закрытия всего что открыто..

Где-то так:

   Equ_NEW=AccountEquity();                              // С новым тиком запоминаем текущее значение эквити
   if (Equ_OLD!=Equ_NEW)                                 // Если новое значение не равно старому, то
         {
            if (NormalizeDouble(Equ_NEW-Equ_OLD,8)<0)    // Если эквити уменьшилось по отношению к своему прошлому значению,
               {                                         
                  ClosePosFirstProfit(NULL, -1, -1);     // то закрываем все позиции
                  DeleteOrders(NULL, -1, -1);            // и удаляем все ордера.
                  Equ_NEW=AccountEquity();               // Запоминаем текущее значение эквити
                  Equ_OLD=Equ_NEW;                       // и заносим его в "прошлое" значение для проверки на изменение на след. тике
               }
         }

// (NormalizeDouble(Equ_NEW-Equ_OLD,8)<0) - возможно здесь нужно сравнивать не с нулём, а с каким-то числом, 
                                         // а то может в последующем и не дать увеличиться балансу, 
                                         // постоянно закрывая вновь открываемые позиции (они ведь требуют залога)

Впрочем, это всего лишь информация к размышлению, а не готовый код...

 
drknn:

Конечно. Только это называется не стопом, а отложенным ордером. Откройте терминал. Нажмите в нём F1. В появившемся окошке откройте Содержание -  Торговля - Типы ордеров.

))) спасибо, но после фонды смущает/непривычно исполнение по бидам и аскам вместо трейда, когда что-то смущает - не стесняюсь задать дурацкий вопрос чтобы снять сомнения. )))
 

подскажите . у дилера пять знаков после запятой . требуется получить цену открытия минус n,баров .функция iOpen(NULL,0,n) дает только четыре знака после запятой (показания получены через print). как же решить проблему . заранее благодарен.

 
pips500:

подскажите . у дилера пять знаков после запятой . требуется получить цену открытия минус n,баров .функция iOpen(NULL,0,n) дает только четыре знака после запятой (показания получены через print). как же решить проблему . заранее благодарен.

Print() округляет до 4-х знаков, для того что бы корректно вывести в консоль тип double (который возвращает iOpen() с точностью в 5 знаков после запятой, в данном случае), нужно воспользоваться функцией DoubleToStr()

string DoubleToStr( double value, int digits)
Преобразование числового значения в текстовую строку, содержащую символьное представление числа в указанном формате точности. 

Параметры:

value   -   Величина с плавающей точкой.

digits   -   Формат точности, число цифр после десятичной точки (0-8).

 
sllawa3:
интересует перелом эквити с возрастания на убывание при условии что эквити выше баланса.. для закрытия всего что открыто..

А вот вам пример того, как это работает... Я специально сделал открытие позиций на каждом новом баре... Получился такой вот "Убийца ДЦ" ... :)


Во вложении отчёт тестера, где нет лимитников и открытие позиций на каждом тике - бешенный процент... и никаких просадок :) Жаль, так работать никто не позволит...

Вот картинка из отчёта:


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


Файлы: