Помощь в кодировании - страница 707

 

Уважаемые про-кодеры,

Я хотел бы реализовать в своем советнике функцию "четыре сделки в день / остановка торговли при достижении цели по прибыли".

Если максимальный торговый лимит / прибыль достигнута, советник должен ждать до следующего дня, чтобы продолжить торговлю.

Мне интересно, может ли кто-нибудь просмотреть мой код, у меня тут немного "заморозка мозга", поэтому код

является своего рода псевдокодом... ;-)

Заранее спасибо!

extern int    MaxShortTrades   = 2;
extern int    MaxLongTrades    = 2;
extern double profitTarget     = 300; // Target in Money

// Count Trades per Day.

   int y;
   int totalOrders = 4;
   datetime toT; // Time of Trade
   datetime doT; // Day of Trade
   datetime now = TimeCurrent();
   datetime boD=now-now%86400; // Beginning of day

 

if (AccountProfit()>= profitTarget)

{

 

for(y=0;y<totalOrders; y++)
     {

      if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
        {
         toT=OrderOpenTime(); // Time of Trade
         doT=toT-toT%86400; // Day of Trade.
         if(doT==boD)
           { // Time of Trade within Current Day.

            for(j=OrdersTotal()-1;j>=0; j--)
              {
               if(OrderType()==OP_BUY)  totalOrders++;  // Check # of long trades.
               if(OrderType()==OP_SELL) totalOrders++; // Check # of short trades
              }

           }
        }
     }


   if(totalOrders<MaxLongTrades  &&  Indicator_LONG_signal) Order=SIGNAL_BUY;
   if(totalOrders<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
 
mladen:

Чтобы проверить как историю (для ордеров, закрытых в текущий день), так и открытые ордера, попробуйте сделать следующее:

   datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
   int totalOrdersLong  = 0, totalOrdersShort = 0;  
      for(int y=OrdersHistoryTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
         if (OrderCloseTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }

   if(totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  

Привет Младен,

Большое спасибо за помощь, теперь стало понятнее, как с этим работать.

Можно ли также проверить наличие "дневной цели прибыли"? Допустим, советник должен пройти 50.- EUR в день,

если цель на день достигнута, он должен прекратить торговлю и продолжить на следующий день.....

Возможно, что-то вроде этого:

extern double profitTarget=50; // Profit Target in money

if (AccountProfit()<= profitTarget)

{
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
   int totalOrdersLong  = 0, totalOrdersShort = 0;  
      for(int y=OrdersHistoryTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
         if (OrderCloseTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }

   if(totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  
}

// Check if Profit Targer for the day is reached, so close all open Opsitions

if (AccountProfit()>= profitTarget)

{
if(OrderSelect(buy_ticket,SELECT_BY_TICKET))
                    {
                     dummyResult=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage*PipMultiplier,MediumSeaGreen);
                     Print("Error closing Buy #",(string)OrderTicket()," Error code ",(string)GetLastError());
                    }
                 }
               else

              if(Order==SIGNAL_CLOSESELL && sell_ticket!=0)
                 {
                  if(OrderSelect(sell_ticket,SELECT_BY_TICKET))
                    {
                     dummyResult=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage*PipMultiplier,DarkOrange);
                     Print("Error closing Sell #",(string)OrderTicket()," Error code ",(string)GetLastError());
                    }
}
 
tfi_markets:

Здравствуйте, Младен,

Большое спасибо за помощь, теперь стало понятнее, как с этим работать.

Можно ли также проверить "дневную цель прибыли"? Скажем, советник должен пройти 50.- EUR в день,

если цель на день достигнута, он должен прекратить торговлю и продолжить на следующий день.....

Возможно, что-то вроде этого:

extern double profitTarget=50; // Profit Target in money

if (AccountProfit()<= profitTarget)

{
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
   int totalOrdersLong  = 0, totalOrdersShort = 0;  
      for(int y=OrdersHistoryTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
         if (OrderCloseTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }

   if(totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  
}

// Check if Profit Targer for the day is reached, so close all open Opsitions

if (AccountProfit()>= profitTarget)

{
if(OrderSelect(buy_ticket,SELECT_BY_TICKET))
                    {
                     dummyResult=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage*PipMultiplier,MediumSeaGreen);
                     Print("Error closing Buy #",(string)OrderTicket()," Error code ",(string)GetLastError());
                    }
                 }
               else

              if(Order==SIGNAL_CLOSESELL && sell_ticket!=0)
                 {
                  if(OrderSelect(sell_ticket,SELECT_BY_TICKET))
                    {
                     dummyResult=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage*PipMultiplier,DarkOrange);
                     Print("Error closing Sell #",(string)OrderTicket()," Error code ",(string)GetLastError());
                    }
}

Почему бы вам не добавить сбор (суммирование) прибыли в цикл, который проверяет количество открытых в данный момент длинных и коротких ордеров?

Что-то вроде этого :


      double profitSoFarLong=0,profitSoFarShort=0;  
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   { totalOrdersLong++;  profitSoFarLong  += OrderProfit()+OrderCommission()+OrderSwap(); }
            if (OrderType()==OP_SELL)  { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
         }        
      }

А затем вы можете использовать profitSoFarLong и profitSoFarShort для дальнейшего контроля.


PS: если вы хотите иметь общую сумму (для закрытых и открытых ордеров), аналогичное дополнение кода можно добавить и к уже закрытым ордерам)

 

Здравствуйте, Младен,

Вы исправили индикатор "AutoFiboAutoTrend" для меня, и он хорошо работает. Можно ли добавить звуковое оповещение с уведомлением, когда направление фибо меняется с "вверх" на "вниз"? Пожалуйста, посмотрите изображения 1 + 2

Спасибо Lea

Файлы:
Fibo 1.jpg  19 kb
Fibo 2.jpg  45 kb
 
mladen:

Почему бы вам не добавить сбор (суммирование) прибыли в цикл, который проверяет количество открытых в данный момент длинных и коротких ордеров?

Что-то вроде этого :


      double profitSoFarLong=0,profitSoFarShort=0;  
      for(int y=OrdersTotal()-1;y>=0; y--)
      {
         if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   { totalOrdersLong++;  profitSoFarLong  += OrderProfit()+OrderCommission()+OrderSwap(); }
            if (OrderType()==OP_SELL)  { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
         }        
      }

А затем вы можете использовать profitSoFarLong и profitSoFarShort для дальнейшего контроля.


PS: если вы хотите иметь общую сумму (по закрытым и открытым ордерам), то аналогичное дополнение кода можно добавить и к уже закрытым ордерам)

Привет, Младен,

большое спасибо за помощь!

Я реализовал код следующим образом:

// Trades per Day and Profit Target

   datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
   int totalOrdersLong  = 0, totalOrdersShort = 0;  
   int x;
      for(x=OrdersHistoryTotal()-1;x>=0; x--)
      {
         if (OrderSelect(x,SELECT_BY_POS,MODE_HISTORY))
         if (OrderCloseTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }        
      }
      for(x=OrdersTotal()-1;x>=0; x--)
      {
         if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   totalOrdersLong++;
            if (OrderType()==OP_SELL)  totalOrdersShort++;
         }            
      
      }
      
   double profitSoFarLong=0,profitSoFarShort=0;  
      for(x=OrdersTotal()-1;x>=0; x--)
      {
         if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
         if (OrderOpenTime()>=today)
         {
            if (OrderType()==OP_BUY)   { totalOrdersLong++;  profitSoFarLong  += OrderProfit()+OrderCommission()+OrderSwap(); }
            if (OrderType()==OP_SELL)  { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
         }        
      }
  
// EA STOP if Profit is Reached.

if (profitSoFarLong>50 || profitSoFarLong>50)
{
            if(OrderType()==OP_BUY)  { dummyResult = OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_ASK),0,CLR_NONE); }
            if(OrderType()==OP_SELL) { dummyResult = OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_BID),0,CLR_NONE); }

      Print ("Account Profit Reached. All Open Trades Have Been Closed");
      return(0);
  
   Sleep(3600); // one hour

}
 
Rajiv:
Пожалуйста, помогите мне, Младен. SLIPPAGE не работает в прикрепленном советнике

Раджив

Проскальзывание находится в правильном месте в вызове OrderSend() - попробуйте использовать какое-то большее значение и протестируйте его, так как в коде оно используется нормально.

 

Пожалуйста, помогите мне... Можно ли записывать в .csv файл каждое "Закрытие" со всеми средствами экспорта
в коде этот индикатор

void RSI_output(string SymbolName,int PeriodMinutes)

{

   int size=iBars(SymbolName,PeriodMinutes);                                      if(size==0)  return;

   int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV);  if (handle<0)return;


   FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");

   for (int i=size-1;i>=0;i--)

      {

        FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))

,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)

,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));

      }

   FileClose(handle);      

   return;

}

int start() { RSI_output(_Symbol,_Period); return(0); }

Я хочу сохранять в .csv файл каждое "закрытие" без зависания и повторного обновления файла. Просто заканчивая файл на одной строке ... каждую минуту, например))))))) ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, ПОЖАЛУЙСТА. Дайте мне рабочий инструмент для взаимодействия с R.

 
kostumer27:

Пожалуйста, помогите мне... Можно ли записывать в .csv файл каждое "Close" всеми средствами экспорта.
в коде этого индикатора

void RSI_output(string SymbolName,int PeriodMinutes)

{

   int size=iBars(SymbolName,PeriodMinutes);                                      if(size==0)  return;

   int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV);  if (handle<0)return;


   FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");

   for (int i=size-1;i>=0;i--)

      {

        FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))

,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)

,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));

      }

   FileClose(handle);      

   return;

}

int start() { RSI_output(_Symbol,_Period); return(0); }

Я хочу сохранять в .csv файл каждое "закрытие" без зависания и обновление файла снова. Просто завершение файла на одной строке ... каждую минуту, например))))))) ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, ПОЖАЛУЙСТА. Дайте мне рабочий инструмент для взаимодействия с R.

Вы имеете в виду на каждом новом баре?
 
Да. история того что есть на графике + 1 бар (& мои iCustom индикаторы). только прошу без переписывания файла навсегда.
Стабильный файл + каждая планка ))) Все =)
 
kostumer27:
Да. история того, что есть на графике + 1 бар (& мои iCustom индикаторы). просто спросите, не переписывая файл навсегда.
Стабильный файл + каждая планка ))) Все =)

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

#property indicator_chart_window
#property indicator_buffers 0

extern bool RewriteOldData=true;
void RSI_output(string symbolName,int PeriodMinutes, datetime time)
{
   string name = (RewriteOldData) ? symbolName+PeriodMinutes : symbolName+PeriodMinutes+(string)(time/60);
   int size  =iBars(symbolName,PeriodMinutes);                if(size==0)  return;
   int handle=FileOpen(name+"_RSI.csv",FILE_WRITE|FILE_CSV);  if (handle<0)return;


   FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
   for (int i=size-1;i>=0;i--)
        FileWrite(handle,iTime(symbolName,PeriodMinutes,i),TimeToStr(iTime(symbolName,PeriodMinutes,i))
               ,iOpen(symbolName,PeriodMinutes,i),iLow(symbolName,PeriodMinutes,i),iHigh(symbolName,PeriodMinutes,i)
               ,iClose(symbolName,PeriodMinutes,i),iVolume(symbolName,PeriodMinutes,i),iCustom(symbolName,PeriodMinutes,"RSI",0,i));
   FileFlush(handle);              
   FileClose(handle);      
   return;

}
int start()
{
   static datetime lastTime=0;
               if (lastTime!=Time[0])  RSI_output(_Symbol,_Period,Time[0]);
                   lastTime= Time[0];
   return(0);
}

Это индикатор, и все, что вам нужно сделать, это установить параметр RewriteOldData и пусть он работает.

Файлы: