а как вы оцениваете вашу работу как программиста по разработке советников ? - страница 2

 
Оценка моей работы как программиста по разработке советников зависит от нескольких факторов. Помимо количества строк кода, которое я обычно оцениваю по тарифу 1 доллар за строку, я также учитываю сложность задачи, время, затраченное на разработку, а также качество и эффективность конечного продукта. Действительно, оценка стоимости разработки по строкам кода может быть неполной, так как часто возникают дополнительные доработки и изменения после завершения работы. Поэтому важно принимать во внимание и другие факторы, такие как сложность проекта и степень индивидуализации требуемых функций. Несмотря на то, что начальная почасовая ставка обычно начинается от 20 долларов, опытные программисты могут рассматривать разработку советников как интересное творческое и интеллектуальное занятие. Для меня важно не только финансовое вознаграждение, но и удовлетворение от создания инновационных и полезных инструментов для трейдеров.
 

Недавно мне скинули код. Я офигел от такого написания. Видимо тоже считали стоимость по количеству строк...)))

#property copyright "Copyright 2024, Neural2024"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrBlue
#property indicator_color2 clrRed
#property indicator_width1 1
#property indicator_width2 1
//============================================
enum ON_OFF {
             on, //ON
             off //OFF
             };
enum BEAR_BULL_OFF {
             uBull_dBear, //UP-бычья, DOWN-медвежья
             uBear_dBull, //UP-медвежья, DOWN-бычья
             none //ВЫКЛ
             };
enum TYPE_SIGN {
             in,      //нахождение в канале
             out,     //нахождение вне канала
             tick_in, //момент перехода в канал
             tick_out //момент перехода из канала
             };
enum TYPE_LINE_STOCH {
             total,   //двух линий
             no_total //любой линии
             };
enum TYPE_TIME { 
             en_time, // разрешить торговлю
             dis_time // запретить торговлю
             };
enum TYPE_MAIL { 
             one_time, // один раз при первом появлении сигнала
             all_time  // при каждом появлении сигнала
             };
//============================================
extern string             txt0         = "~~~~~~ Сторонний индикатор 1 ~~~~~~"; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
extern ON_OFF             on_off_main1 = on;                  // Включение
extern string             name_ind1    = "FB_Neural";        // Название индикатора
extern int                bufferUP1    = 1;                   // Буфер стрелки "ВВЕРХ"
extern int                bufferDN1    = 0;                   // Буфер стрелки "ВНИЗ"
extern string             txt01        = "";                  //.
extern string             txt02        = "~~~~~~ Сторонний индикатор 2 ~~~~~~"; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
extern ON_OFF             on_off_main2 = on;                  // Включение
extern string             name_ind2    = "Forex_Binary_Grail_Indicator_fix";        // Название индикатора
extern int                bufferUP2    = 0;                   // Буфер стрелки "ВВЕРХ"
extern int                bufferDN2    = 1;                   // Буфер стрелки "ВНИЗ"
extern string             txt012       = "";                  //.
extern string             txt29        = "";                  //.
extern int                ots          = 15;                  //Расстояние стрелок от свечей (в пипсах)
extern ON_OFF             AlertSound   = 0;                 //Включение звукового алерта
extern string             txt30        = "";                  //.
extern ON_OFF             AlertMail    = 1;                 //Включение отправки сигнала на E-mail
extern ON_OFF             AlertNotif   = 1;                 //Включение отправки сигнала на мобильн.терминал
extern TYPE_MAIL          mail_type    = 0;                   //Отправлять сигнал во время формирования свечи ...

double buyBuffer[];
double sellBuffer[];

bool   indicatorsON=true;
int time_cnt = 0;
bool soundBuy = false;
bool soundSell = false;
bool sendMail = true;
datetime timeBar = iTime(NULL,0,0);
datetime timeBar_prev = iTime(NULL,0,0);
double rollback_bar;

int init()
{
// Buffers and style
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 225);
SetIndexBuffer(0, buyBuffer);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 226);
SetIndexBuffer(1, sellBuffer);
// Data window
IndicatorShortName("Neural2024");

if(true&&true&&
true&&
true&&true&&true&&
true&&
true&&
true&&
true&&
true&&true&&true&&
true&&true&&
true&&true&&
true&&true&&
on_off_main1==1&&on_off_main2==1&&true) indicatorsON=false;

 return(INIT_SUCCEEDED);
}

int deinit()
{
 Comment("");
 return(0);
}

int start()
{
 if(indicatorsON) Tick();
 return(0);
}

void Tick()
  {
      double gap  = ots*Point;

    int limit;
    int counted_bars = IndicatorCounted();
    if(counted_bars < 0) 
        return;
    if(counted_bars > 0) 
        counted_bars--;
    limit = Bars - counted_bars;

    for(int i = 0; i < limit; i++)
     {   
      if(false||false||false) continue;

       // Long signal
      if(BuySell_signal("buy",i))
       buyBuffer[i] = Low[i]-gap;
       else
       buyBuffer[i] = EMPTY_VALUE;

        // Short signal
      if(BuySell_signal("sell",i))
       sellBuffer[i] = High[i]+gap;
       else
       sellBuffer[i] = EMPTY_VALUE;
        }

        string  messageBuy  =  StringConcatenate("Neural2024 (", Symbol(), ", ", Period(), ")  -  BUY!!!" ,"-" ,TimeToStr(TimeLocal(),TIME_SECONDS));
        string  messageSell =  StringConcatenate("Neural2024 (", Symbol(), ", ", Period(), ")  -  SELL!!!","-"  ,TimeToStr(TimeLocal(),TIME_SECONDS));
     if(mail_type==0)
     {timeBar = iTime(NULL,0,0);
      if (timeBar_prev!=timeBar) sendMail = true;
      timeBar_prev = iTime(NULL,0,0);}

     if (buyBuffer[0] == Low[0]-gap && soundBuy)
         {
           soundBuy = false;
           if(AlertSound==0) Alert(messageBuy);
          if(sendMail)
           {sendMail = false;
            if(AlertNotif==0) SendNotification(messageBuy);
            if(AlertMail==0)  SendMail("Neural2024",messageBuy);}
          }
      if (!soundBuy && (buyBuffer[0] == EMPTY_VALUE)) {soundBuy = true;  if(mail_type==1) sendMail = true;}
     if (sellBuffer[0] == High[0]+gap && soundSell)
         {
           soundSell = false;
           if(AlertSound==0) Alert(messageSell);
          if(sendMail)
           {sendMail = false;
            if(AlertNotif==0) SendNotification(messageSell);
            if(AlertMail==0)  SendMail("Neural2024",messageSell);}
          }
      if (!soundSell && (sellBuffer[0] == EMPTY_VALUE)) {soundSell = true;  if(mail_type==1) sendMail = true;}

}

bool BuySell_signal(string b_s, int i)
 {
     if(b_s=="buy")
       // Long signal
      {if(
true
          &&
true
          &&
         (on_off_main1==1 || fun_main1("up",i))
          &&
         (on_off_main2==1 || fun_main2("up",i))
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
         )
       return(true);
       else
       return(false);}

     if(b_s=="sell")
        // Short signal
      {if(
true
          &&
true
          &&
         (on_off_main1==1 || fun_main1("dn",i))
          &&
         (on_off_main2==1 || fun_main2("dn",i))
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
          &&
true
         )
       return(true);
       else
       return(false);}
    return(false);
  }

bool fun_main1 (string up_dn, int index)
 {
  double _b = EMPTY_VALUE;
  double _s = EMPTY_VALUE;

                    _b = iCustom(NULL, 0, name_ind1, bufferUP1, index);
                    _s = iCustom(NULL, 0, name_ind1, bufferDN1, index);
                     if(up_dn=="up")
                        {
                         if( _b!=EMPTY_VALUE && _b!=0 ) return(true); else return(false);
                         }
                     if(up_dn=="dn")
                        {
                         if( _s!=EMPTY_VALUE && _s!=0 ) return(true); else return(false);
                         }
  return(false);
  }

bool fun_main2 (string up_dn, int index)
 {
  double _b = EMPTY_VALUE;
  double _s = EMPTY_VALUE;

                    _b = iCustom(NULL, 0, name_ind2, bufferUP2, index);
                    _s = iCustom(NULL, 0, name_ind2, bufferDN2, index);
                     if(up_dn=="up")
                        {
                         if( _b!=EMPTY_VALUE && _b!=0 ) return(true); else return(false);
                         }
                     if(up_dn=="dn")
                        {
                         if( _s!=EMPTY_VALUE && _s!=0 ) return(true); else return(false);
                         }
  return(false);
  }

Видали такое написание???

)))

 

По стилю написания видно, что программист с большим опытом, но учился сам через Ютуб.

"Настрогал" этот индюк за пару часов на 314 строк. 

Видать, ему платили за количество строк...

)))

 

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

У меня самые короткие коды в мире по количеству строк и я быстрее остальных выполняю заказы.

Получается, из Ваших расчетов стоимости заказа, что я должен получать меньше тугодумов и любителей растягивать строки???

 
Dmitry Sumsky #:

Видать, ему платили за количество строк...

)))

Это вряд ли. Обычно при заказе советников, индикаторов, скриптов, берут "болванку", т.е. готовый рабочий код похожего и бОльшего функционала и объема, вырезают или отключают ненужное и добавляют недостающее.
Так получается быстрее, меньше ошибок и в конечном счете дешевле для заказчика. В данном коде фрагменты типа

if(true&&true&&
true&&
true&&true&&true&&
true&&
true&&
true&&
true&&
true&&true&&true&&
true&&true&&
true&&true&&
true&&true&&
on_off_main1==1&&on_off_main2==1&&true) indicatorsON=false;

скорее всего получились после удаления нескольких условий в исходном советнике и заменой их на "true", хотя можно было просто вырезать с тем же эффектом.

Причина обращения: