/// <summary> /// enter position logic /// логика входа в позицию /// </summary> private void Trade() { if (_candles1.Count - 1 - CountCandles <= 0) { return; } if (_candles1.Count < 10) { _positionNumbers = new List <PairDealStausSaver>(); return; } if (_positionNumbers == null) { _positionNumbers = new List <PairDealStausSaver>(); } decimal movePersent1 = 100 / _candles1[_candles1.Count - 1 - CountCandles].Close * _candles1[_candles1.Count - 1].Close; decimal movePersent2 = 100 / _candles2[_candles2.Count - 1 - CountCandles].Close * _candles2[_candles2.Count - 1].Close; if (movePersent1 > movePersent2 && movePersent1 - movePersent2 > SpreadDeviation) { List <Position> positons1 = _tab1.PositionOpenShort; if (positons1 == null || positons1.Count == 0) { Position pos1 = _tab1.SellAtLimit(Volume1, _candles1[_candles1.Count - 1].Close - Slipage1); Position pos2 = _tab2.BuyAtLimit(Volume2, _candles2[_candles2.Count - 1].Close + Slipage2); PairDealStausSaver saver = new PairDealStausSaver(); saver.Spred = movePersent1 - movePersent2; saver.NumberPositions.Add(pos1.Number); saver.NumberPositions.Add(pos2.Number); _positionNumbers.Add(saver); } } if (movePersent2 > movePersent1 && movePersent2 - movePersent1 > SpreadDeviation) { List <Position> positons2 = _tab2.PositionOpenShort; if (positons2 == null || positons2.Count == 0) { Position pos1 = _tab2.SellAtLimit(Volume2, _candles2[_candles2.Count - 1].Close - Slipage2); Position pos2 = _tab1.BuyAtLimit(Volume1, _candles1[_candles1.Count - 1].Close + Slipage1); PairDealStausSaver saver = new PairDealStausSaver(); saver.Spred = movePersent2 - movePersent1; saver.NumberPositions.Add(pos1.Number); saver.NumberPositions.Add(pos2.Number); _positionNumbers.Add(saver); } } }
/// <summary> /// save settings /// загрузить публичные настройки из файла /// </summary> private void Load() { if (!File.Exists(@"Engine\" + NameStrategyUniq + @"SettingsBot.txt")) { return; } try { using (StreamReader reader = new StreamReader(@"Engine\" + NameStrategyUniq + @"SettingsBot.txt")) { Enum.TryParse(reader.ReadLine(), true, out Regime); Volume1 = Convert.ToDecimal(reader.ReadLine()); Volume2 = Convert.ToDecimal(reader.ReadLine()); Slipage1 = Convert.ToDecimal(reader.ReadLine()); Slipage2 = Convert.ToDecimal(reader.ReadLine()); CountCandles = Convert.ToInt32(reader.ReadLine()); SpreadDeviation = Convert.ToDecimal(reader.ReadLine()); Loss = Convert.ToDecimal(reader.ReadLine()); Profit = Convert.ToDecimal(reader.ReadLine()); string[] positions = reader.ReadLine().Split('%'); if (positions.Length != 0) { for (int i = 0; i < positions.Length; i++) { string[] pos = positions[i].Split('$'); if (pos.Length == 2) { PairDealStausSaver save = new PairDealStausSaver(); save.NumberPositions.Add(Convert.ToInt32(pos[0])); save.Spred = Convert.ToDecimal(pos[1]); _positionNumbers.Add(save); } } } reader.Close(); } } catch (Exception) { // ignore } }
/// <summary> /// exit position logic /// логика выхода из позиции /// </summary> private void CheckExit() { if (_candles1.Count - 1 - CountCandles < 0) { return; } decimal movePersent1 = 100 / _candles1[_candles1.Count - 1 - CountCandles].Close * _candles1[_candles1.Count - 1].Close; decimal movePersent2 = 100 / _candles2[_candles2.Count - 1 - CountCandles].Close * _candles2[_candles2.Count - 1].Close; decimal spredNow = Math.Abs(movePersent1 - movePersent2); for (int i = 0; _positionNumbers != null && i < _positionNumbers.Count; i++) { PairDealStausSaver pairDeal = _positionNumbers[i]; if (spredNow > pairDeal.Spred && spredNow - pairDeal.Spred > Loss) { NeadToClose(pairDeal.NumberPositions[0]); NeadToClose(pairDeal.NumberPositions[1]); _positionNumbers.Remove(pairDeal); i--; continue; } if (pairDeal.Spred > spredNow && pairDeal.Spred - spredNow > Profit) { NeadToClose(pairDeal.NumberPositions[0]); NeadToClose(pairDeal.NumberPositions[1]); _positionNumbers.Remove(pairDeal); i--; } } }