[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 94

 

Приветствую всех!

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

//+------------------------------------------------------------------+
//|                                                 Demark Lines.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 2       // Количество буферов
#property indicator_color1 Green     // Цвет первой линии
#property indicator_color2 Red      // Цвет второй линии

double Buf_UP[],Buf_DN[];             // Объявление массивов (под буферы индикатора)

extern int History=21;        // Колич.баров в расчётной истории
extern int M= 3;           // начальный бар с которого начинаем поиск фракталов в цикле.
int    i,k;                // номера баров в циклах.
int    Vnf3,Vnf2,Vnf1;     // номера реперных фракталов (1-ый справа на графике на нисходящем тренде).
int    VnfL3,VnfL2,VnfL1;  // номера реперных фракталов (1-ый справа на графике на восходящем тренде).
int    VFN,VFNL;           // счетчик найденных фракталов.
int    Md,MdL;             // счетчики кол-ва модификаций
int counted_bars;
double VMF1,VMF2;     // промежуточные значения верхних фракталов на нисходящем тренде.
double VMFL1,VMFL2;  // промежуточные значения нижних фракталов на восходящем тренде.
double VlFl_L;             // Min значение ближайшего нижнего фрактала на тренде вниз
double VlFl_H;             // Max значение ближайшего верхнего фрактала на тренде вверх
datetime tim1_L;           // Время ближайшего нижнего фрактала после нисходящего тренда 
datetime timL1_H;          // Время ближайшего верхнего фрактала после восходящего тренда 

datetime tim1,tim2,tim3;   // время для построения линий вилки Чувашова.
datetime timL1,timL2,timL3;// время для построения линий вилки Чувашова.

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexBuffer(0,Buf_UP);         // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);// Стиль линии
   SetIndexBuffer(1,Buf_DN);         // Назначение массива буферу
   SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,1);// Стиль линии
   
   counted_bars=IndicatorCounted();
   return;                          // Выход из спец. ф-ии init()

  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  int limit=counted_bars;
  counted_bars=IndicatorCounted();
   if (counted_bars!=limit)
      {int Razmer=ArraySize(Buf_DN);
       for (i=Razmer;i>=0;i--)
         {Buf_DN[i]=0;
         }
         Razmer=ArraySize(Buf_UP);
         for (i=Razmer;i>=0;i--)
         {Buf_UP[i]=0;
         }
       }  
//----
   for (i=2;i<=History;i++)
    {//цикл
    if(High[i]>High[i+1] &&High[i]>High[i-1]&&High[i]>Close[i-2])
     {//фрактал
      VFN++;           // счетчик найденного фрактала.
      // ------------------------------------------------------------+
      if(VFN==1)       // если 1-ый фрактал найден, запоминаем значения: Max[i], № свечи[i], время[i]:
        {// f1
           Vnf1=i;        // запоминаем номер Max бара найденного фрактала.
           VMF1=High[i];  // запоминаем Max значение 1-ого найденного фрактала.
           tim1=iTime(NULL,0,i);        // запоминаем время 1-ой опорной точки.
         }//-f1
    // --------------------------------------------------------------+
    if(VFN==2)        // если 2-ый фрактал найден, запоминаем значения: Max[i], № свечи[i], время[i]:
      {// f2
          VMF2=High[i];    // запоминаем Max значение 2-ого найденного фрактала.
          if(VMF2>VMF1)    // если Max значение 2-го фрактала больше 1-го (т.е. направлена вниз),
            {
              Vnf2=i;      // запоминаем номер Max бара найденного фрактала.
              tim2=iTime(NULL,0,i);      // запомним время 2-ой опорной точки.
            }
            else VFN=VFN-1;
       }//-f2
    // --------------------------------------------------------------+
   
    

// ------------------------------------------------------------------+
   if(VFN==2) break; // найдены все 2 фрактала, выходим из цикла.
// ------------------------------------------------------------------+ 
    }//-фрактал                      
   }//-цикл 
//----
 //int k=0;
   
  
  


for (i=2;i<=History;i++)
    {//цикл
    if(Low[i]<Low[i+1] &&Low[i]<Low[i-1]&&Low[i]<Close[i-2])
     {//фрактал
      VFNL++;           // счетчик найденного фрактала.
      // ------------------------------------------------------------+
      if(VFNL==1)       // если 1-ый фрактал найден, запоминаем значения: Max[i], № свечи[i], время[i]:
        {// f1
           VnfL1=i;        // запоминаем номер Max бара найденного фрактала.
           VMFL1=Low[i];  // запоминаем Max значение 1-ого найденного фрактала.
           
           timL1=iTime(NULL,0,i);        // запоминаем время 1-ой опорной точки.
         }//-f1
    // --------------------------------------------------------------+
    if(VFNL==2)        // если 2-ый фрактал найден, запоминаем значения: Max[i], № свечи[i], время[i]:
      {// f2
          VMFL2=Low[i];    // запоминаем Max значение 2-ого найденного фрактала.
          if(VMFL2<VMFL1)    // если Max значение 2-го фрактала больше 1-го (т.е. направлена вниз),
            {
              VnfL2=i;      // запоминаем номер Max бара найденного фрактала.
              timL2=iTime(NULL,0,i);      // запомним время 2-ой опорной точки.
            }
            else VFNL=VFNL-1;
       }//-f2
    // --------------------------------------------------------------+

// ------------------------------------------------------------------+
   if(VFN==2) break; // найдены все 2 фрактала, выходим из цикла.
// ------------------------------------------------------------------+ 
    }//-фрактал                      
   }//-цикл 

 //_________________________________Отрисовка индикатора_________________________________________________
  
  if (Vnf1<VnfL1&&Vnf2!=0)               // если ближайший фрактал - вверх
 
  {int k=Vnf2;
   for (i=Vnf2;i>=0;i--)
    {
     Buf_DN[i]= EquationDirect(Vnf2, VMF2, Vnf1,VMF1,k);
     k--;
    }}
   if (VnfL1<Vnf1&&VnfL2!=0)       //если ближайший фрактал - вниз
 
 {k=VnfL2;
   for (i=VnfL2;i>=0;i--)
    {
     Buf_UP[i]= EquationDirect(VnfL2, VMFL2, VnfL1,VMFL1,k);
     k--;
    }}
 //_____________________________________________________________________________________________________
    

   return(0);
  }
//+------------------------------------------------------------------+


  
   double EquationDirect(double x1, double y1, double x2, double y2, double x) //прямая линия
   {
if (x2==x1) return(y1);
return((y2-y1)/(x2-x1)*(x-x1)+y1);}

риходится перезапускать его вручную.

 
phh200400:
можно ли скачать индикатор для волн зллиота

Конечно можно. Нужно найти и скачать
 
Поисковая строка в гугле:
индикатор волн зллиота site:mql4.com
 

Спасибо,splxgf !!!!!!!!!!!!!!!

В частности, вот тут if ( OrderType( )==OP_BUY && OrderType( )==OP_SELL )

Ну конечно ордер может быть одновременно на покупку и на продажу, но я бы поставил ||

Ржу!! Да, я прогнал... В натуре..

if (NormalizeDouble(OrderClosePrice()-OrderTakeProfit(), Digits)<0.5*Point)


Рекомендую уточнить кто такой поинт и почему он умножается на 0,5? Да просто вариант без нормализе дубле, не так надежен, если сравнивать с нолём. Тут работает.

Тикет целый тип, OrderClose булевой... лучше так не делать.

while цикл бесконечный, а делается попытка удалять только рыночные ордера, если будет один отложенный, то эта музыка будет вечной. Спасибо!! !!!!


 

Парни подскажите в чем разница ?????

if(OrderSymbol()!=Symbol())continue;

и

if(OrderSymbol()==Symbol())

???????????

 

Да, не знаю.. Ну, continue;должно пасылать на предидущий цикл, и его может перебирать, наверно, до совпадения, смотря как он написан.

Помогите!!!!!!! (мой пост на предидущей странице)!

 
//+------------------------------------------------------------------+
//|             AsctrendBuySellExpert_v1.mq4  code by Newdigital     |
//|                                     https://www.forex-tsd.com     |
//|                using Gordago software http://www.gordago.com     |
//| - Asctrend code for this EA was taken from                       |
//|   AscTrend_NonLag EA coded by of Igorad.                         |
//| - "Non-Trading Hours" on the screen fixing code by Locutus       |
//|   from Updated DayTradingMM EA                                   |
//+------------------------------------------------------------------+
#property copyright "newdigital"
#property link      "https://www.forex-tsd.com"

#include <stderror.mqh> // библиотека ошибок
#include <stdlib.mqh>
extern int MAGIC  = 100111;

extern string PARAMETERS_EXPERT = "PARAMETERS EXPERT";
extern color clOpenBuy = Blue;
extern color clCloseBuy = Aqua;
extern color clOpenSell = Red;
extern color clCloseSell = Violet;
extern color clModiBuy = Blue;
extern color clModiSell = Red;
extern string Name_Expert = "AsctrendBuySellExpert";
extern bool UseSound = False;
extern string NameFileSound = "alert.wav";

extern string PARAMETERS_FILTER = "PARAMETERS FILTER";
extern bool UseHourTrade = False;
extern int FromHourTrade = 8;
extern int ToHourTrade = 18;


extern string PARAMETERS_TRADE = "PARAMETERS TRADE";
extern double Lots = 0.10;
extern int Slippage = 4;
extern double lStopLoss = 1000;
extern double sStopLoss = 1000;
extern double lTakeProfit = 1000;
extern double sTakeProfit = 1000;
extern double lTrailingStop = 1000;
extern double sTrailingStop = 1000;

extern string PARAMETERS_INDICATOR_ONE  = "ASCTrend";
extern bool    UseASCtrend    = True;
extern int     RISK           = 3;
int asctrend,asctrend1;
int ASCtrend,ASCtrend1;



void deinit() {
   Comment("");
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

int start(){
   if (UseHourTrade){
   if((Hour()>=FromHourTrade)&&(Hour()<=ToHourTrade))
      Comment("Trading Hours");
   else
     {
      Comment("Non-trading Hours");
      return(0);
     }
   }
   if(Bars<100){
      Print("bars less than 100");
      return(0);
   }
   if(lStopLoss<10){
      Print("StopLoss less than 10");
      return(0);
   }
   if(lTakeProfit<10){
      Print("TakeProfit less than 10");
      return(0);
   }
   if(sStopLoss<10){
      Print("StopLoss less than 10");
      return(0);
   }
   if(sTakeProfit<10){
      Print("TakeProfit less than 10");
      return(0);
   }
   
   if (UseASCtrend)
{
ASCtrend = ASCTrend(RISK);
bool ASCtrendBuy  = ASCtrend>0 && ASCtrend1<0;  
bool ASCtrendSell = ASCtrend<0 && ASCtrend1>0;
} 
else {ASCtrendBuy = true; ASCtrendSell = true;}

   if(AccountFreeMargin()<(1000*Lots)){
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0);
   }
   if (!ExistPositions()){

      if ((ASCtrendBuy)){
         OpenBuy();
         return(0);
      }

      if ((ASCtrendSell)){
         OpenSell();
         return(0);
      }
   }
   if (ExistPositions()){
      if(OrderType()==OP_BUY){

         if ((ASCtrendSell)){
            CloseBuy();
            return(0);
         }
      }
      if(OrderType()==OP_SELL){

         if ((ASCtrendBuy)){
            CloseSell();
            return(0);
         }
      }
   }
   TrailingPositionsBuy(lTrailingStop);
   TrailingPositionsSell(sTrailingStop);
   ASCtrend1=ASCtrend;
   return (0);
}

bool ExistPositions() {
        for (int i=0; i<OrdersTotal(); i++) {
                if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
                        if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
                                return(True);
                        }
                } 
        } 
        return(false);
}
void TrailingPositionsBuy(int trailingStop) { 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { 
            if (OrderType()==OP_BUY) { 
               if (Bid-OrderOpenPrice()>trailingStop*Point) { 
                  if (OrderStopLoss()<Bid-trailingStop*Point) 
                     ModifyStopLoss(Bid-trailingStop*Point); 
               } 
            } 
         } 
      } 
   } 
} 
void TrailingPositionsSell(int trailingStop) { 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { 
            if (OrderType()==OP_SELL) { 
               if (OrderOpenPrice()-Ask>trailingStop*Point) { 
                  if (OrderStopLoss()>Ask+trailingStop*Point || OrderStopLoss()==0)  
                     ModifyStopLoss(Ask+trailingStop*Point); 
               } 
            } 
         } 
      } 
   } 
} 
void ModifyStopLoss(double ldStopLoss) { 
   bool fm;
   fm = OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE); 
   if (fm && UseSound) PlaySound(NameFileSound); 
} 

void CloseBuy() { 
   bool fc; 
   fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy); 
   if (fc && UseSound) PlaySound(NameFileSound); 
} 
void CloseSell() { 
   bool fc; 
   fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell); 
   if (fc && UseSound) PlaySound(NameFileSound); 
} 
void OpenBuy() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 
   ldLot = GetSizeLot(); 
   ldStop = GetStopLossBuy(); 
   ldTake = GetTakeProfitBuy(); 
   lsComm = GetCommentForOrder(); 
   BroCoOrderSend(Symbol(),OP_BUY,ldLot,Ask,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpenBuy); 
   if (UseSound) PlaySound(NameFileSound); 
} 
void OpenSell() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 

   ldLot = GetSizeLot(); 
   ldStop = GetStopLossSell(); 
   ldTake = GetTakeProfitSell(); 
   lsComm = GetCommentForOrder(); 
   BroCoOrderSend(Symbol(),OP_SELL,ldLot,Bid,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpenSell); 
   if (UseSound) PlaySound(NameFileSound); 
} 
string GetCommentForOrder() {   return(Name_Expert); } 
double GetSizeLot() {   return(Lots); } 
double GetStopLossBuy() {       return (Bid-lStopLoss*Point);} 
double GetStopLossSell() {      return(Ask+sStopLoss*Point); } 
double GetTakeProfitBuy() {     return(Ask+lTakeProfit*Point); } 
double GetTakeProfitSell() {    return(Bid-sTakeProfit*Point); }

int ASCTrend( int risk )
{

   double smin, smax, bsmin, bsmax;
   int len = 3 + 2*risk;
   
   smin=Low[Lowest(NULL,0,MODE_LOW,len,1)]; 
   smax=High[Highest(NULL,0,MODE_HIGH,len,1)];

   bsmax = smax-(smax - smin)*(33.0-risk)/100.0;
   bsmin = smin+(smax - smin)*(33.0-risk)/100.0;

   asctrend = asctrend1;
   
   if(Close[1]>bsmax)  asctrend= 1; 
   if(Close[1]<bsmin)  asctrend=-1;
   
   asctrend1 = asctrend;
  return(asctrend);
}    
//+------------------------------------------------------------------+
//| Функция для работы с дилинговым центром BroCo                    |
//+------------------------------------------------------------------+
int BroCoOrderSend(string symbol, 
                 int cmd, 
                 double volume, 
                 double price, 
                 int slippage, 
                 double stoploss, 
                 double takeprofit, 
                 string comment, 
                 int magic, 
                 datetime expiration, 
                 color arrow_color)
{
   int ticket = OrderSend(symbol,cmd, volume, price, slippage, 0, 0, comment, magic, expiration, arrow_color);   
   int check = -1;
   if (ticket > 0 && (stoploss != 0 || takeprofit != 0)) {
      if (!OrderModify(ticket, price, stoploss, takeprofit,expiration, arrow_color)) {
         check = GetLastError();
         if (check != ERR_NO_ERROR) {
            Print("OrderModify error: ", ErrorDescription(check));
         }
      }
   } else {
      check = GetLastError();
      if (check != ERR_NO_ERROR){
         Print("OrderSend error: ",ErrorDescription(check));
      }
   }
   return (ticket);
}  
  
//----------------------------------------------------------------
Привет всем! Мужики, наткнулся на старенького эксперта, работающего по индикатору asctrend, давно хотел проверить как себя ведет данный индикатор в режиме реального времени, но уследить за точками не всегда получается, и картина торговли получается не полной. Проверил на тестере, сигнал есть при каждом появлении точки, но поставил на демо и заметил такую вещь, что на демке пропускает сигналы, хотя в журнал ничего не пишет эксперт, ковырялся в коде так и не понял в чем загвоздка :( может кто ткнет носом в чем может быть проблема?
 
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      if (NormalizeDouble(OrderClosePrice()-OrderTakeProfit(), Digits)<0.5*Point) {
         Alert("Позиция с тикетом #",OrderTicket()," закрыта по TakeProfit, закрываем остальные прозиции и удаляем отложенные ордера");
         // Здесь код для закрытия всех открытых позиций (тоже в цикле)
         for (  int y=OrdersTotal()-1; y>=0; y--) {Alert ("Здесь код для закрытия всех открытых позиций (тоже в цикле)",y);
           OrderSelect(y, SELECT_BY_POS );
              if (  OrderType( )==OP_BUY || OrderType( )==OP_SELL ){
                          OrderClose( OrderTicket( ), OrderLots( ), OrderClosePrice( ) , 0, CLR_NONE);
   Alert ("OrderClose-vse-2",  GetLastError( ) ); C=0;A=1; }} 
         // Здесь код для удаления всех отложенных ордеров (также в цикле)
         for ( int f=OrdersTotal()-1; f>=0; f--) {Alert("Здесь код для удаления всех отложенных ордеров (также в цикле)",f);
         OrderSelect(f, SELECT_BY_POS );
           if (  OrderType( )==OP_BUYSTOP || OrderType( )==OP_SELLSTOP ){ 
            OrderDelete(OrderTicket( )) ; Alert ("OrderDelete-vse-2",  GetLastError( ) ); }}   // CloseAll();
         }
      }
Я уж так написал, а в журнал пишет только сообщение первого алерта
 

После переустановки терминала перестал работать MetaEditor. Комилирует только в случае, если не изменяешь ничего в коде индикатора. Если что-то изменил, даже хотя бы цвет линии, выдает ошибку:

ОС Windows 7. Может кто-то сталкивался с подобным глюком. Подскажите, что делать?

 
Ребята с длинными кодами! Хочу ещё раз повторить, что чужой код - это прежде всего криптограмма, которую ещё предстоит расшифровать! А это труд и не малый! Думаете кому-то из программеров захочется копаться в километрах листинга? Давайте я дам свой код кому-то из вас, всего-то на тройку тысяч строк и попрошу устранить небольшое недоразумение этого кода. Думаете вы просто так захотите вникать в моё детище? Опять сомневаюсь. Поэтому у меня к вам пожелание - задавая ключевой вопрос, описывайте проблему максимально кратко и вместе с тем описание делайте достаточным для понимания сути. В противном случае ваш крик - это крик в пустоту. Код можно приложить к посту. Этого всего необходимо и достаточно.
Причина обращения: