А давайте сделаем из этого "мультик" (мультивалютник) - страница 6

 
Swan >>:

ошибка 130 постоянно.

StopLevel проверять надо, для StopLoss и Enter.


и исчо

должно выбираться наибольшее?


-130 видимо из-за попытки установить отложенник, а цена ушла выше или ниже) в коде есть строчки закоментированные с Маркетлевел.. это и есть будущее слежение за ценой, чтоб не было этой ошибки)

-наименьшее значение лоу или хай от OrderOpenPrice для стопа) Если бай, то наименьший лоу H4 из 0 свечи и 1 свечи... и наибольший хай для сел.. Вобщем наименьший лоу/хай для стопа

 
ALex2008 >>:

-130 видимо из-за попытки установить отложенник, а цена ушла выше или ниже) в коде есть строчки закоментированные с Маркетлевел.. это и есть будущее слежение за ценой, чтоб не было этой ошибки)

-наименьшее значение лоу или хай от OrderOpenPrice для стопа) Если бай, то наименьший лоу H4 из 0 свечи и 1 свечи... и наибольший хай для сел.. Вобщем наименьший лоу/хай для стопа

Исправить нада, сейчас для buy выбираеться наибольший лоу, и наименьший хай для sell.

или так

StopLoss=MathMin(b0,b1);
StopLoss=MathMax(s0,s1);
 
Swan >>:

Исправить нада, сейчас для buy выбираеться наибольший лоу, и наименьший хай для sell.

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

Пример:


Но ваш вариант лучше и проще... на него и исправлю, только наоборот) Сенькс.

StopLoss=MathMax(b0,b1);
StopLoss=MathMin(s0,s1);

Исправил код на 5 стр.

 
ALex2008 >>:

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



таки для buy наименьшее)

imho лучше наибольшее и тралить по первому бару, другая логика :)


со StopLevel.

можно Enter изменить

void UpTrend()
   {
   if(iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0
   && iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)
      {
      DellAllOrders();
      Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      if(Enter-Ask<StopLevel) Enter=Ask+StopLevel;
      OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+Profit, 0, 0,0, Green);
      }
   }

или сразу открыть ордер

void UpTrend()
   {
   if(iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0
   && iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)
      {
      DellAllOrders();
      Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      if(Enter-Ask<StopLevel)
      OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, 0, Ask+Profit, 0, 0,0, Green);
      else 
      OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+Profit, 0, 0,0, Green);
      }
   }

или еще что придумать)

 
Swan писал(а) >>

таки для buy наименьшее)

imho лучше наибольшее и тралить по первому бару, другая логика :)

со StopLevel.

можно Enter изменить

или сразу открыть ордер

или еще что придумать)

Цена открытия должна быть дальше на стоплевел от Bid или Ask. От цены открытия считать тейки и стопы, которые тоже должны быть не ближе стоплевел. Хотя для них можно сделать блок закрытия по профиту или просадке

 
Swan >>:

...imho лучше наибольшее и тралить по первому бару, другая логика :)

Делал и так.. но результат по тестингу лучше у текущего стопа)

 

Поправил стоплевел...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         DellAllOrders();
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(Ask<=Enter-StopLevel){
         RefreshRates();
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+Profit, 0, 0,0, Green);}
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         DellAllOrders();
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(Bid>=Enter+StopLevel){
         RefreshRates();
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter-Profit, 0, 0,0, Green);}
      }
  }

   
//-------Вычисление стопа и утановка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if(Type==0){
            StopLoss=MathMax(b0,b1);//Функция возвращает максимальное из двух числовых значений
            if(Bid-StopLoss<StopLevel) StopLoss=MathMin(b0,b1); 
            else OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
         }
         if(Type==1){
            StopLoss=MathMin(s0,s1);//Функция возвращает минимальное из двух числовых значений
            if(StopLoss-Ask<StopLevel) StopLoss=MathMax(s0,s1);
            else OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
         }
   }


Swan >>:

...или сразу открыть ордер

Надёжнее всётаки отложенниками входить) А то или ДЦ чего выдаст или нонфармы откроют тебя очень далеко..))

*код подправил

 
ALex2008 >>:

Поправил стоплевел...


Надёжнее всётаки отложенниками входить) А то или ДЦ чего выдаст или нонфармы откроют тебя очень далеко..))

*код подправил

Правим старые баги, добавляем новые :D


тож поправил)

//+------------------------------------------------------------------+
//|                                                    CandyLite.mq4 |
//|                                                    Ш.Александр.В |
//|                                              shestovav@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Ш.Александр.В"
#property link      "shestovav@gmail.com"

#include <stdlib.mqh>

extern double Profit = 3000;

int Type,Ticket;
double Stop,StopLevel,b0,b1,s0,s1,StopLoss,Enter;
bool dwn,up,mod;

int init(){
   Profit*=Point; 
   return(0);
  }

int deinit() {
   return(0);
  }

int start() {
   StopLevel=Point*MarketInfo(Symbol(),MODE_STOPLEVEL);   // вычисление стоплевел //Point*
   
   if(!WorkOrders()){
      UpTrend();
      DownTrend();
   }
      
   if(WorkOrders()){
      if ((Type<=1)&& (Stop==0))SetStop();
      if ((Type==1)||(Type==5))UpTrend();
      if ((Type==0)||(Type==4))DownTrend();
   }

   return(0);
  }
//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         DellAllOrders();
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(Ask<Enter-StopLevel+0.5*Point){
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+Profit, 0, 0,0, Green);}
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         DellAllOrders();
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(Bid>Enter+StopLevel-0.5*Point){
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter-Profit, 0, 0,0, Green);}
      }
  }

//-------Вычисление стопа и установка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if(Type==0){
            StopLoss=MathMax(b0,b1);//Функция возвращает максимальное из двух числовых значений
            if(Bid-StopLoss<StopLevel-0.5*Point) StopLoss=MathMin(b0,b1); 
            if(Bid-StopLoss>StopLevel-0.5*Point)//можно попробовать убрать строку
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
         }
         if(Type==1){
            StopLoss=MathMin(s0,s1);//Функция возвращает минимальное из двух числовых значений
            if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=MathMax(s0,s1);
            if(StopLoss-Ask>StopLevel-0.5*Point)//можно попробовать убрать строку
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
         }
   }
   
//-------Удаление всех ордеров, открытых и отложенных
void DellAllOrders(){
      if(WorkOrders()){
      if(Type<=1)OrderClose(Ticket,OrderLots(),OrderClosePrice(),10);
      else OrderDelete(Ticket);}
  }
  
//-------Поиск ордеров
bool WorkOrders(){
      for (int i=OrdersTotal()-1;i>=0;i--){
      if (!OrderSelect(i,SELECT_BY_POS))  continue;
      if (OrderSymbol()!=Symbol())        continue;
      Type  = OrderType();
      Ticket=OrderTicket();
      Stop  =OrderStopLoss();
      return(true);}
  return(false);
  }
 
Swan >>:

Правим старые баги, добавляем новые :D

для чего?

0.5*Point

И MarketInfo() возвращает вроде и так тип double, зачем его переводить в Point?..

Вот это тоже... два условия..


if(Bid-StopLoss<StopLevel-0.5*Point) StopLoss=MathMin(b0,b1); 
if(Bid-StopLoss>StopLevel-0.5*Point)//можно попробовать убрать строку

Вроде всё, что заметил.. Лучше конечно объяснить что для чего менялось) Чтоб мне на будущее иметь ввиду)

 
ALex2008 >>:

это для чего? не пойму..)

И MarketInfo() возвращает вроде и так тип double, зачем его переводить в Point?..

Вот это тоже...


0.5*Point - дельта, можно и 0.7 :)

см. сравнение вещественных чисел.

возможно будет правильно работать и без этого. в большинстве случаев)


ошибка была

MarketInfo(Symbol(),MODE_STOPLEVEL)

возвращает значение в пипсах. умножил на Point.


Было

            if(Bid-StopLoss<StopLevel) StopLoss=MathMin(b0,b1); 
            else OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);

при true StopLoss присваивается новое значение,

иначе модифицируеться ордер.

ошибки нет, но нада или крестик снять иль штаны одеть)

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