Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
Код:
Expand Collapse Copy
if (   /* Сигнал купить*/ )
{
if( bs== 0 && BuyPos == 0 )
{
//     1 BUYSTOP  
    }
  D_S_DELL_15();  D_SS_del_15();  // Удаляем  OP_SELL и OP_SELLSTOP
bs--   МИНУСУЕМ ИЗ ПЕРЕБОРА ОРДЕРОВ -1 BUYSTOP  
  }

Sleep( 9 минут);  ЛОЖИМ  СОВУ СПАТЬ НА 9 МИН И СИГНАЛА КУПИТЬ НЕТ  :)
В РЫНКЕ 1 BUYSTOP  НО ПО СЧЁТЧИКУ 0 
ПРОСЫПАЕМСЯ И ПРОВЕРЯЕМ: ЕСЛИ  BUYSTOP  СТАЛ БАЕМ ТО bs == 0 && BuyPos>0
   if( bs == 0 && BuyPos > 0 && BuyPos == 0  ) {
    if( bs == 0) {
  if(    /* Сигнал купить*/ )
  {
  //    1 BUYSTOP  
       }
bs-- 
BuyPos --
Sleep( 9 минут);  ???
      }
     }
Ну это не точно так как имеет место быть :)
С какого перепугу во сне советник вдруг определит, что BUYSTOP стал вдруг баем? С таким-же успехом этот советник может сказать что BUYSTOP стал шейхом.
Ну извини, дальше без меня. Вместо того, чтобы понять свои ошибки, ты пытаешься доказать мне что я «идиот» у тебя всё правильно.
Только один вопрос: Разве такая запись BuyPos > 0 && BuyPos == 0 не равнозначна этой BuyPos >= 0
 

mobidik

-----
С какого перепугу во сне советник вдруг определит, что BUYSTOP стал вдруг баем? С таким-же успехом этот советник может сказать что BUYSTOP стал шейхом.
:D
Только один вопрос: Разве такая запись BuyPos > 0 && BuyPos == 0 не равнозначна этой BuyPos >= 0
А вот тут я не соглашусь, у автора: условие "выполниться" если BuyPos > 0 (есть позиция(и)) И BuyPos == 0 (нет позиций), что в корне не совпадает с твоим виденьем, твое условие имеет шанс на выполнение, чего не скажешь об оригинальной записи... :)
 

sergeysv

Активный участник
Вместо того, чтобы понять свои ошибки, ты пытаешься доказать мне что
С моими знаниями по коду ,которые по любой шкале равны 1 я не вправе кому то что либо доказывать.
Мне нужно чтоб работало стабильно и как надо и по этому спрашиваю будет так работать или нет. Придумали тоже -,"_ доказывать" :)
 

AlexeyVik

Программист mql4 mql5
:D

А вот тут я не соглашусь, у автора: условие "выполниться" если BuyPos > 0 (есть позиция(и)) И BuyPos == 0 (нет позиций), что в корне не совпадает с твоим виденьем, твое условие имеет шанс на выполнение, чего не скажешь об оригинальной записи... :)
Ну да. Мала мала чукча ошибка давала. Я не смог так прочесть… но получилось здорово. «позиция есть и позиции нет» Жесть¡¡¡
 

griz

Активный участник
Подскажите, по какой формуле можно найти цену безубытка? Открыты позиции в buy и в sell, разными объемами. Как найти цену, при которой прибыль будет равна нулю?
 
Последнее редактирование:

MrGreen86

Гуру форума
Подскажите, по какой формуле можно найти цену безубытка? Открыты позиции в buy и в sell, разными объемами. Как найти цену, при которой прибыль будет равна нулю?
формула простая:
(цена ордера 1 *лот ордера 1 + цена ордера 2 * лот ордера2 +....+ цена ордера N * лот ордера N) / (лот ордера 1 + лот ордера 2 + .... + лот ордера N).
Это без учета свопа и комиссий.
свопы и комиссии суммируешь отдельно.
Далее если это ордера бай, то из цены полученной в формуле 1 вычитаешь:
(свопы и комиссии / (стоимость пункта по этому инструменту * суммарный лот)) * _Point.
если это селл, то наоборот прибавляешь.

стоимость пункта по этому инструменту SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE), оно дается как для 1 лота.
 

ISHAK-1987

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

Вложения

griz

Активный участник
Что-то неправильно считает по формуле. Допустим, открыты позиции:

buy по цене 1.1774 объемом 0.5 лот
buy по цене 1.1760 объемом 0.5 лот
sell по цене 1.1855 объемом 0.5 лот
sell по цене 1.1826 объемом 0.5 лот
sell по цене 1.1820 объемом 0.5 лот

(1.1774 * 0.5 + 1.1760 * 0.5 + 1.1855 * 0.5 + 1.1826 * 0.5 + 1.1820 * 0.5) / 2.5 = 1.1807

Свопы пока не в счет. Цена 1.1807 не может быть безубытком. Где-то ошибка.

1.png
 

MrGreen86

Гуру форума
Что-то неправильно считает по формуле. Допустим, открыты позиции:

buy по цене 1.1774 объемом 0.5 лот
buy по цене 1.1760 объемом 0.5 лот
sell по цене 1.1855 объемом 0.5 лот
sell по цене 1.1826 объемом 0.5 лот
sell по цене 1.1820 объемом 0.5 лот

(1.1774 * 0.5 + 1.1760 * 0.5 + 1.1855 * 0.5 + 1.1826 * 0.5 + 1.1820 * 0.5) / 2.5 = 1.1807

Свопы пока не в счет. Цена 1.1807 не может быть безубытком. Где-то ошибка.

Посмотреть вложение 397788
формула была указана для одного направления. у вас разные направления.
формула для разных направлений суммарно почти такая же, но селл нужно не складывать а вычитать:
(бай_цена_1 * бай_лот_1 + бай_цена_2 * бай_лот_2 - селл_цена_1*селл_лот_1 - селл_цена_1*селл_лот_1) / (бай_лот_1 + бай_лот_2 - селл_лот_1 - селл_лот_2)

В коде все будет выглядеть так:

Код:
Expand Collapse Copy
double price_sum  = 0;
double lot_sum    = 0;
double snc_sum    = 0;
for(int i=OrdersTotal()-1;i>=0;i--) {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   if(OrderSymbol()!=_Symbol) continue;
   //if(OrderMagicNumber()!=magic) continue; если нужно, убрать //
   if(OrderType()==OP_BUY) {
      price_sum   += OrderOpenPrice() * OrderLots();
      lot_sum     += OrderLots();
      snc_sum     += OrderCommission() + OrderSwap();
   }
   if(OrderType()==OP_BUY) {
      price_sum   -= OrderOpenPrice() * OrderLots();
      lot_sum     -= OrderLots();
      snc_sum     += OrderCommission() + OrderSwap();
   }
}
// считаем цену без убытка
double   price_avg = 0;
if(lot_sum != 0.0) { // только если есть перевес в какую либо сторону, иначе у нас замок, и без убытка нет
   price_avg = price_sum / lot_sum;
   // в данном случае не нужно делать разедления на бай и селл, так как знак поменяется из-за переменной lot_sum, которая отрицательная если sell перевешивает
   price_avg -= (snc_sum / (SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE) * lot_sum))*_Point;
}
 
  • Like
Реакции: griz

griz

Активный участник
Спасибо. Уже цена безубытка ближе к истине. Только в одном из условий OP_BUY нужно изменить на OP_SELL
Код:
Expand Collapse Copy
   if(OrderType()==OP_BUY) {
      price_sum   += OrderOpenPrice() * OrderLots();
      lot_sum     += OrderLots();
      snc_sum     += OrderCommission() + OrderSwap();
   }
   if(OrderType()==OP_BUY) {
      price_sum   -= OrderOpenPrice() * OrderLots();
      lot_sum     -= OrderLots();
      snc_sum     += OrderCommission() + OrderSwap();
   }
 

griz

Активный участник
Хотя есть еще один момент. Если не писать эту строчку кода, то все ок, безубыток как и должен быть равен нулю. А вот если писать эту строку кода, то уже безубыток -108$
Код:
Expand Collapse Copy
price_avg -= (snc_sum / (SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE) * lot_sum))*_Point;
 
Последнее редактирование:

MrGreen86

Гуру форума
Хотя есть еще один момент. Если не писать эту строчку кода, то все ок, безубыток как и должен быть равен нулю. А вот если писать эту строку кода, то уже безубыток -108$
Код:
Expand Collapse Copy
price_avg -= (snc_sum / (SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE) * lot_sum))*_Point;
это учет свопа и комиссий. все наоборот. без нее без убыток -108$, с ней 0.
 
  • Like
Реакции: griz

AlexeNP

Гуру форума
Подскажите, по какой формуле можно найти цену безубытка? Открыты позиции в buy и в sell, разными объемами. Как найти цену, при которой прибыль будет равна нулю?
блин, люди... вы в арифметику-то умеете?
постановка задачи: положим что у нас отрыты 2 позиции объемами lot1 и lot2 по ценам p1 и p2. Требуется найти такую цену p0, при которой прибыль по этим позициям достигала бы наименьшего значения.
Смотрим как изменяется прибыль по каждой из позиций прибыля1 = lot1*(p0-p1) прибыля2 = lot2*(p0-p2)
для нахождения минимума воспользуемся методом наименьших квадратов МНК = (lot1*(p0-p1))^2+(lot2*(p0-p2))^2, находим производную по p0, приравниваем ее 0 и решаем относительно p0

p0 = (lot1^2*p1 + lot^2*p2)/(lot1^2 + lot^2)
 

griz

Активный участник
блин, люди... вы в арифметику-то умеете?
постановка задачи: положим что у нас отрыты 2 позиции объемами lot1 и lot2 по ценам p1 и p2. Требуется найти такую цену p0, при которой прибыль по этим позициям достигала бы наименьшего значения.
Смотрим как изменяется прибыль по каждой из позиций прибыля1 = lot1*(p0-p1) прибыля2 = lot2*(p0-p2)
для нахождения минимума воспользуемся методом наименьших квадратов МНК = (lot1*(p0-p1))^2+(lot2*(p0-p2))^2, находим производную по p0, приравниваем ее 0 и решаем относительно p0

p0 = (lot1^2*p1 + lot^2*p2)/(lot1^2 + lot^2)


o_O:eek: это слишком сложно и непонятно
 

AlexeNP

Гуру форума

Вложения

nurfirdaus

Новичок форума
кто может помочь мне создать или узнать, какая кодовая база может создавать макеты, как на картинках?GOLDH1.png
 

Вложения

  • MM2.mq4
    MM2.mq4
    5,5 КБ · Просмотры: 10

nurfirdaus

Новичок форума
Я попробовал прямой 2-мерный массив, но результат не является удовлетворительным, потому что Есть пары, которые не организовать это должно быть, например, "JPYCAD" должен быть "CADJPY". Пожалуйста, если кто-то может помочь?

test.png

Код:
Expand Collapse Copy
string DefaultPairs[] = {"AUDCAD", "AUDCHF", "AUDJPY", "AUDNZD", "AUDUSD", "CADCHF", "CADJPY", "CHFJPY", "EURAUD", "EURCAD", "EURCHF", "EURGBP", "EURJPY", "EURNZD", "EURUSD",
                         "GBPAUD", "GBPCAD", "GBPCHF", "GBPJPY", "GBPNZD", "GBPUSD", "NZDCAD", "NZDCHF", "NZDJPY", "NZDUSD", "USDCAD", "USDCHF", "USDJPY"
                        };
string TradePairs[];

string symBase[8], symQuote[8];

   for(int i = 0; i < ArraySize(TradePairs); i++) {

      for(int j = 0; j < 8; j++) {

         if(currlist[t] == StringSubstr(TradePairs[i], 0, 3)) {
            symBase[0] = currlist[(int)array[0][1]];
            symBase[1] = currlist[(int)array[1][1]];
            symBase[2] = currlist[(int)array[2][1]];
            symBase[3] = currlist[(int)array[3][1]];
            symBase[4] = currlist[(int)array[4][1]];
            symBase[5] = currlist[(int)array[5][1]];
            symBase[6] = currlist[(int)array[6][1]];
            symBase[7] = currlist[(int)array[7][1]];
         }
      }
      
      for(int j = 0; j < 8; j++) {

         if(currlist[t] == StringSubstr(TradePairs[i], 3, 3)) {
            symQuote[0] = currlist[(int)array[0][1]];
            symQuote[1] = currlist[(int)array[1][1]];
            symQuote[2] = currlist[(int)array[2][1]];
            symQuote[3] = currlist[(int)array[3][1]];
            symQuote[4] = currlist[(int)array[4][1]];
            symQuote[5] = currlist[(int)array[5][1]];
            symQuote[6] = currlist[(int)array[6][1]];
            symQuote[7] = currlist[(int)array[7][1]];
         }
      }
   }
  
   Print(symBase[1] + symQuote[7]); // Result JPYCAD, it should be CADJPY
 

AlexeNP

Гуру форума
Я попробовал прямой 2-мерный массив, но результат не является удовлетворительным, потому что Есть пары, которые не организовать это должно быть, например, "JPYCAD" должен быть "CADJPY". Пожалуйста, если кто-то может помочь?

Посмотреть вложение 398690
честно говоря, не понял чего ты хочешь добиться) но вот строка 8
i < ArraySize(TradePairs)
а какой размер у массива TradePairs?
 

nurfirdaus

Новичок форума
честно говоря, не понял чего ты хочешь добиться) но вот строка 8
i < ArraySize(TradePairs)
а какой размер у массива TradePairs?

ArraySize (TradePairs) является фильтром, чтобы получить базу символов и qoute. пример, как это, чтобы получить базу, if(currlist[t] == StringSubstr(TradePairs, 0, 3)) ;

на самом деле я хочу получить список символов, как на картинке. У меня есть доля mq4 Здесь

GOLDH1.png
 
Верх