Pomoc - automatyczne przeciwstawne zlecenie do otwartego

O jezykach programowania w platformach i nie tylko.
marcin76
Gaduła
Gaduła
Posty: 300
Rejestracja: 14 lis 2012, 12:42

Pomoc - automatyczne przeciwstawne zlecenie do otwartego

Nieprzeczytany post autor: marcin76 »

Witam mam prośbę może ktoś wie jak to poprawić , aby po otwarciu pozycji Buy i cena cofnie się o np 20 pips otworzy automatycznie przeciwstawne zlecenie Sell


extern double Zone_Distans =20;

void OrderBuy() {
int ticket;
for(int i=0;i<3;i++)
{

double MyPoint=Point;
if( Digits==3 || Digits==5) MyPoint=Point*10;

ticket=OrderSend(Symbol(),OP_BUY, LotSize ,Ask,Slippage,Ask-StopLoss*MyPoint,Ask+TakeProfit*MyPoint,"Order Buy",MagicNumber,0,Green);
if(ticket>0){break;}
RefreshRates();

}

}

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Pomoc - automatyczne przeciwstawne zlecenie do otwartego

Nieprzeczytany post autor: -rookie- »

ajć, sorry, nie to :oops:
Dobra, post do usuniecia, przerwa.

marcin76
Gaduła
Gaduła
Posty: 300
Rejestracja: 14 lis 2012, 12:42

Re: Pomoc - automatyczne przeciwstawne zlecenie do otwartego

Nieprzeczytany post autor: marcin76 »

-rookie- pisze:ajć, sorry, nie to :oops:
Dobra, post do usuniecia, przerwa.

dzięki za pomoc i podpowiedzi , ale chyba źle to trochę objaśniłem , więc mam 2 EA chciałem je połączyć w jedno .

1 EA ButtonEA otwiera pozycje po przyciśnięciu guzika BUY SELL itd.
2 EA Zone_Recovery_Area - po otwarciu pozycji BUY jak cena idzie w przeciwną stronę otwiera SELL i tak na przemian - tzw hedge


Chciałem do 1 EA wstawić funkcjonalność hedgeu z 2 EA , kombinowałem na różne sposoby i mi to nie wychodziło , więc poprosiłem o pomoc .

Gdyby mi ktoś to poprawił dla 1 guzika BUY to by wystarczyło kolejne bym sobie zrobił już sam

dzięki
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Pomoc - automatyczne przeciwstawne zlecenie do otwartego

Nieprzeczytany post autor: -rookie- »

Chyba już nie ma tutaj za wiele osób zajmujących się kodowaniem... Nie mam teraz za bardzo chęci żeby grzebać się w tych EA, ale mogę podsunąć proste rozwiązanie jak ja bym sobie z tym poradził. Może dzięki temu wpadniesz jak to zaimplementować i rozwiązać w swoich EA.
Opis + obrazek - https://images89.fotosik.pl/35/a6130e80cb06747e.png

1. Włącz test EURUSD od 04.04.2018 tak jak na moim obrazku
2. Odległość w pipsach liczę tym wzrorem

Kod: Zaznacz cały

double distance = NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2);
3. W funkcji openHedgeByDirection() przerywam program na początku sprawdzając czy nie ma żadnych pozycji oraz sprawdzając calcLotSize() ponieważ zwraca to odchylenie albo w lewo albo w prawo wielkości lotów, więc jeśli hedge będzie otwarty wtedy jako wartość będzie zwracało 0, więc gdy już tak się stanie trzeba przerwać bo wywala błąd w ordersend. Możesz sprawdzić usuwając tą linie że po otwarciu hedge 20 pips dalej wywalać będzie błędy. Więc przy moim podejściu jest to potrzebne.

Kod: Zaznacz cały

 if (calcLotSize() == 0) return;
4. I na końcu funkcja calcLotSize() która liczy właśnie odchylenie od 0 na minus lub na plus wielkości lotów. Tylko jest to proste rozwiązanie dla 1 instrumentu, bez uwzględniania tego że będziesz miał włączone kilka takich EA itp. Prosty przykład. Możesz wrzucić do tego EA z guzikami tą funkcje i otwierać na BUY i SELL po 0.01 lota i będziesz widział że jak na BUY będziesz miał otwarte 0.56 a na SELL 0.73 to wynik będzie -0.17. Dlatego tam niżej musiałem to przemnożyć przez -1 żeby sprowadzić do dodatniej liczby ponieważ nie wolno wprowadzać minusowej wartości jako wielkość pozycji.
5. Tutaj jest kod z tym przykładem. Wygeneruj EA w generatorze, wklej ten kod, włącz od 04.04.2018 i zobaczysz jak to działa. Tylko tyle mogę pomóc w tej kwestii.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                         12092018_EA_xds123nr.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern int MagicNumber = 100;
extern int Slippage = 3;
extern double LotSize = 0.04;

extern double Zone_Distans = 20;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0,"Sell["+0+"]", MagicNumber, 0, clrRed);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      openHedgeByDirection();
      
      Print( " check test " + calcLotSize() );
  }
//+------------------------------------------------------------------+

double calcLotSize() {
   double res = 0;
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (OrderType() == 0) {
            res = res += OrderLots();
         } else if (OrderType() == 1) {
            res = res -= OrderLots();
         }
      }
   }
   return NormalizeDouble(res,2);
}


void openHedgeByDirection() {
   if (OrdersTotal() == 0) return;
   if (calcLotSize() == 0) return;
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         double distance = NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2);
         double lots = calcLotSize();
         if (lots < 0) { lots = calcLotSize() * (-1); }
         if (OrderType() == 0) {
            if (distance < -Zone_Distans) {
               OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, 0, 0,"Sell[" + OrderTicket() + "]", MagicNumber, 0, clrRed);
            }
         } else if (OrderType() == 1) {
            if (distance < -Zone_Distans) {
               OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0,"Buy[" + OrderTicket() + "]", MagicNumber, 0, clrGreen);
            }
         }
      }
   }
}

double getSymbolScale() {
   double res = 0;
   if (Point == 0.00001) { // EURUSD, GBPUSD etc
      res = 10000; // ok
   } else if (Point == 0.001) { // USDJPPY etc
      res = 1000; 
   } else if (Point == 0.01) { // DAX
      res = 100; 
   }
   return res;
}
-- Dodano: 12 wrz 2018, 14:32 --

EA otwiera od razu pozycje SELL na 0.04 lota i akurat 04.04.2018 na EURUSD jest spadek więc to przetestujesz tutaj.

marcin76
Gaduła
Gaduła
Posty: 300
Rejestracja: 14 lis 2012, 12:42

Re: Pomoc - automatyczne przeciwstawne zlecenie do otwartego

Nieprzeczytany post autor: marcin76 »

-rookie- pisze:
EA otwiera od razu pozycje SELL na 0.04 lota i akurat 04.04.2018 na EURUSD jest spadek więc to przetestujesz tutaj.

Dzięki wielkie za pomoc , będę próbował może się uda i sobie jakoś z tym poradzę :D :D :D

jeszcze raz dzięki za tak obszerną odpowiedź

pozdr

ODPOWIEDZ