Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
SuchyRyz
Bywalec
Bywalec
Posty: 17
Rejestracja: 26 lis 2017, 23:24

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: SuchyRyz »

Witam, wie ktoś co zmienić w kodzie tego wskaźnika tak aby nie brał pod uwagę knotów tylko ceny otwarcia i zamknięcia?

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                    GannSwing.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property version   "1.00"
#property description "Gann Swing indicator"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//--- plot GannSwing
#property indicator_label1  "Gann Swing"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- indicator buffers
double         BufferGS[];
double         BufferUS[];
double         BufferDS[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferGS,INDICATOR_DATA);
   SetIndexBuffer(1,BufferUS,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,BufferDS,INDICATOR_CALCULATIONS);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Gann Swing");
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(BufferGS,true);
   ArraySetAsSeries(BufferUS,true);
   ArraySetAsSeries(BufferDS,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
//--- Проверка и расчёт количества просчитываемых баров
   if(rates_total<5) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>0)
     {
      limit=rates_total-4;
      ArrayInitialize(BufferGS,EMPTY_VALUE);
      ArrayInitialize(BufferUS,0);
      ArrayInitialize(BufferDS,0);
     }
//--- Подготовка данных
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      ResetBuffers(i);
      //--- 1.Two consecutive Higher High candles indicate Upswing
      if(high[i]>high[i+1] && high[i+1]>high[i+2])
        {
         BufferUS[i]=1; // Up
        }
      //--- 2.Two consecutive Lower Low candles indicate Downswing
      if(low[i]<low[i+1] && low[i+1]<low[i+2])
        {
         BufferDS[i]=1; // Down
        }
      //--- 4.If the next bar has a higher high and a higher low (or the same low) when
      //--- compared to the previous bar, then the swing line goes up connecting the high of the next bar
      if(BufferUS[i]==0 && high[i]>high[i+1] && low[i]>=low[i+1])
        {
         BufferUS[i]=1; // Up
        }
      //--- 5. If the next bar has a lower high (or same high) and a
      //--- lower low when compared to the previous bar, then the swing line goes down connecting the low of the next bar
      if(BufferDS[i]==0 && high[i]<=high[i+1] && low[i]<low[i+1])
        {
         BufferDS[i]=1; // Down
        }
     }
   int swing_dir=0;
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(BufferUS[i]==1)
        {
         if(swing_dir==1)
            BufferGS[i]=high[i];
         else if(swing_dir==-1)
           {
            BufferGS[i]=high[i];
            swing_dir=1;
           }
         else
           {
            swing_dir=1;
            BufferGS[i]=high[i];
           }
        }
      else if(BufferDS[i]==1)
        {
         if(swing_dir==-1)
            BufferGS[i]=low[i];
         else if(swing_dir==1)
           {
            BufferGS[i]=low[i];
            swing_dir=-1;
           }
         else
           {
            swing_dir=-1;
            BufferGS[i]=low[i];
           }
        }
      else
        {
         if(high[i+1]>high[i+2] && low[i+1]<low[i+3])
           {
            if(high[i]>high[i+1] && low[i]>=low[i+1])
              {
               if(swing_dir==-1)
                  BufferGS[i]=low[i];
               else if(swing_dir==1)
                 {
                  BufferGS[i]=low[i];
                  swing_dir=-1;
                 }
              }
            else if(high[i]<=high[i+1] && low[i]<low[i+1])
              {
               if(swing_dir==1)
                  BufferGS[i]=high[i];
               else if(swing_dir==-1)
                 {
                  BufferGS[i]=high[i];
                  swing_dir=1;
                 }
              }
           }
        }
     }

//--- Расчёт индикатора
   int last=0;
   int last_index=0;
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(BufferGS[i]==high[i])
        {
         if(last==1)
            BufferGS[last_index]=EMPTY_VALUE;
         last=1;
         last_index=i;
        }
      if(BufferGS[i]==low[i])
        {
         if(last==-1)
            BufferGS[last_index]=EMPTY_VALUE;
         last=-1;
         last_index=i;
        }
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ResetBuffers(const int shift)
  {
   BufferGS[shift]=EMPTY_VALUE;
   BufferUS[shift]=BufferDS[shift]=0;
  }
//+------------------------------------------------------------------+

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2447
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Wszędzie, gdzie w kodzie jest high[] i low[] trzeba zmienić na open[], lub close[], a jak to według twojego pomysłu.
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

SuchyRyz
Bywalec
Bywalec
Posty: 17
Rejestracja: 26 lis 2017, 23:24

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: SuchyRyz »

Dzięki wielkie z lekkimi oporami ale jakoś się udało. Mam jeszcze pytanie czy ktoś jest w stanie podpowiedzieć mi co w tym kodzie jest nie tak? Gdy próbuję go uruchomić od razu zawiesza mi się MT4.

Kod: Zaznacz cały

// More information about this indicator can be found at:
//http://fxcodebase.com/code/viewtopic.php?f=38&t=69516

//+------------------------------------------------------------------+
//|                               Copyright © 2020, Gehtsoft USA LLC | 
//|                                            http://fxcodebase.com |
//+------------------------------------------------------------------+
//|                                      Developed by : Mario Jemic  |
//|                                           mario.jemic@gmail.com  |
//|                          https://AppliedMachineLearning.systems  |
//+------------------------------------------------------------------+
//|                                 Support our efforts by donating  |
//|                                  Paypal : https://goo.gl/9Rj74e  |
//|                                 Patreon : https://goo.gl/GdXWeN  |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2020, Gehtsoft USA LLC"
#property link      "http://fxcodebase.com"
#property version   "1.0"
#property strict


input int Period2 = 14; // RSI Period
input bool Reverse = false; // Reverse

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

string IndicatorName;
string IndicatorObjPrefix;

string GenerateIndicatorName(const string target)
{
   string name = target;
   int try = 2;
   while (WindowFind(name) != -1)
   {
      name = target + " #" + IntegerToString(try++);
   }
   return name;
}

double Oscillator[];

int init()
{
   IndicatorName = GenerateIndicatorName("RSI CCI Ratio");
   IndicatorObjPrefix = "__" + IndicatorName + "__";
   IndicatorShortName(IndicatorName);

   IndicatorBuffers(1);

   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, Oscillator);
   SetIndexLabel(0, "Oscillator");

   return 0;
}

int deinit()
{
   ObjectsDeleteAll(ChartID(), IndicatorObjPrefix);
   return 0;
}

int start()
{
   int counted_bars = IndicatorCounted();
   int minBars = 1;
   int limit = MathMin(Bars - 1 - minBars, Bars - counted_bars - 1);
   for (int i = limit; i >= 0; i--)
   {
      double volumeValue =  iCustom(NULL,0,"ClusterDelta_#Volumes","","AUTO","AUTO",0,0);
      double ATRValue = iATR(_Symbol, _Period, Period2, i);
      if (Reverse)
      {
         if (ATRValue != 0)
         {
            Oscillator[i] = volumeValue / ATRValue;
         }
      }
      else
      {
         if (volumeValue)
         {
            Oscillator[i] = ATRValue / volumeValue;
         }
      }
   }
   return 0;
}

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2447
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

Działa bez zarzutów.
2021-03-19_184503.jpg
RSI CCI Ratio.mq4
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

SuchyRyz
Bywalec
Bywalec
Posty: 17
Rejestracja: 26 lis 2017, 23:24

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: SuchyRyz »

Ja wprowadziłem kilka zmian w tym kodzie co wrzuciłem. Próbuję pobrać volumen z clusterdelta i podzielić go przez wartość atr. Na początku myślałem, że to funkcja icumstom jest źle zdefiniowana jednak w innym wskaźniku gdy wrzuciłem taką samą to wszystko działało bez zarzutu dlatego teraz zgłupiałem. Może chodzi o coś z reverse? Dodam, że jeśli chodzi o programowanie to mam taką podstawową wiedzę z technikum więc sorry jeśli odpowiedź jest banalna. :?

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2447
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

SuchyRyz pisze:
19 mar 2021, 18:59
Ja wprowadziłem kilka zmian w tym kodzie co wrzuciłem. Próbuję pobrać volumen z clusterdelta i podzielić go przez wartość atr. Na początku myślałem, że to funkcja icumstom jest źle zdefiniowana jednak w innym wskaźniku gdy wrzuciłem taką samą to wszystko działało bez zarzutu dlatego teraz zgłupiałem. Może chodzi o coś z reverse? Dodam, że jeśli chodzi o programowanie to mam taką podstawową wiedzę z technikum więc sorry jeśli odpowiedź jest banalna. :?
Wiesz, raczej nikomu się nie chce analizować cudzych wypocin...
I, tak, funkcja iCustom jest tu jak najbardziej właściwa, tylko trzeba dobrze wpisać wszystkie parametry z wskaźnika, z którego pochodzą dane z ClusterDelta. Nie znam obecnej sytuacji, ponieważ porzuciłem ClusterDelta już kilka lat temu.
Przykładowe rozwiązanie z jednego z wskaźników przerabianego przeze mnie:

Kod: Zaznacz cały

                                                               |
//+------------------------------------------------------------------+
int CheckVolume(int shift,string ssymbol=NULL,int tf=0)
  {
   int vol=0;
   switch(volume_source)
     {
      case VOL_TICK: vol=iVolume(ssymbol,tf,shift);break;
      case VOL_CLUSTER: vol=iCustom(ssymbol,tf,CD_Subfolder+CD_VolumeIndiName,"",Ticker,Update_in_sec,MetaTrader_GMT,0,shift);break;
     }
   if(vol==EMPTY_VALUE) vol=0;
   return(vol);
  }
//+------------------------------------------------------------------+
A tak w ogóle, to gdzie w tym wskaźniku występuje wolumen, bo ja nie widzę?
Nie w twojej przeróbce, tylko w oryginale.

Jak kończyłeś technikum, to musiałeś się uczyć o jednostkach.
Można podzielić jabłka przez gruszki?
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

SuchyRyz
Bywalec
Bywalec
Posty: 17
Rejestracja: 26 lis 2017, 23:24

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: SuchyRyz »

W oryginale nie ma wolumenu. Ale skoro wartość wolumenu jest liczbowa i wartość atr też jest liczbowa więc raczej nie powinno być problemu w podzieleniu tego. A tak swoją drogą to wystarczyło pobrać starą wersję wskaźnika od clusterdelta, także sory za zamieszanie w piątek wieczorem. :D

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2447
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

SuchyRyz pisze:
19 mar 2021, 20:03
W oryginale nie ma wolumenu. Ale skoro wartość wolumenu jest liczbowa i wartość atr też jest liczbowa więc raczej nie powinno być problemu w podzieleniu tego. A tak swoją drogą to wystarczyło pobrać starą wersję wskaźnika od clusterdelta, także sory za zamieszanie w piątek wieczorem. :D
A spoko, ja tam i tak oprócz wykresów i programowania to za bardzo nic nie mam do roboty...
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 2447
Rejestracja: 30 lip 2019, 13:15

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: ninjaproject »

SuchyRyz pisze:
19 mar 2021, 20:03
W oryginale nie ma wolumenu. Ale skoro wartość wolumenu jest liczbowa i wartość atr też jest liczbowa więc raczej nie powinno być problemu w podzieleniu tego.
Odczuwam potrzebę odniesienia się do tej wypowiedzi, a więc:
1. (9 / 9 = 1) - co to jest?
2. (9x / 9x = 1) - co to jest?
3. (9x / 9y = z) - co to jest?
Teraz, urealnijmy:
x = gruszki, y= jabłka, z = ?
4. (9gruszki / 9jabłka = z?)
5. (9RSI / 9 Vol = ?????????????)

Gdy pytam "co to jest?", to pytam zarówno o to czym jest taka operacja i co przedstawia wynik tej operacji.
Byłbym wdzięczny za współpracę.
Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4.

Szymon_P
Bywalec
Bywalec
Posty: 11
Rejestracja: 31 paź 2015, 22:35

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Szymon_P »

Witam, czy mógłby ktoś pomóc w rozwiązaniu problemu? Jak zapisać, żeby EA sprawdzał zadane warunki o konkretnej godzinie i po niej podejmował dalsze akcje? Innymi słowy analizę ma zacząć dopiero o 12 pomimo uruchomienia np o 10.

ODPOWIEDZ